【问题标题】:Angular test - triggering event from root scope with $emit角度测试 - 使用 $emit 从根范围触发事件
【发布时间】:2015-11-13 04:02:40
【问题描述】:

我正在尝试测试一个正在调用服务的控制器。当这个服务完成它的工作时,它会使用 $emit 将一个事件从根范围内分派出去。我试图在我的测试中模拟这一点,但我无法让事件处理程序运行。谁能看到我做错了什么?

这是我的测试的基本版本:

Files = Mocks.Files;

beforeEach(inject(function($rootScope, $controller) {
    scope = $rootScope.$new();
    $controller("HelpController", { $scope: scope });   // inherit scope from parent

    rootScope = $rootScope.$new(); 
    rootScope.profile = {
        ....
    };

    $controller("HelpContentEditorController", {
        $scope: scope,
        $rootScope: rootScope
        Files: Files
    });

    scope.$apply();
}));

it("should save FileResource to API", function() {
        spyOn(Files, "saveFileAPI");
        scope.saveContent();
        scope.$apply();
        rootScope.$emit("allFilesUploaded", []);
        rootScope.$apply();

        expect(Files.saveFileAPI).toHaveBeenCalled();
    });

然后在我正在测试的控制器内部

function saveContent() {
    var blob = new $window.Blob([JSON.stringify($scope.content)], {type: "text/json"});
    blob.name = "help.json";

    $rootScope.$on("allFilesUploaded", onFilesUploaded);
    Files.upload([blob]);
}

function onFilesUploaded(event, files) {
    Files.saveFileAPI(files[0], files[0].extensions[0]).then(function(data) {
        ...
    }, function (error) {
        ...
    });
}

测试运行没有错误,但从未调用过 onFilesUploaded 方法,因此它失败了。我不确定这是否与我继承范围等的方式有关,但我尝试了一些替代方法

谢谢!

【问题讨论】:

  • 谢谢,我遇到了 rootScope./scope 关系的问题。也感谢您指出不必要的 $apply 调用,删除所有调用实际上很好

标签: angularjs unit-testing testing angularjs-scope jasmine


【解决方案1】:

可能有助于澄清您的测试在做什么:

在 beforeEach 部分中,您创建 scope = $rootScope.$new() 和 rootScope = $rootScope.$new()。这样,scope 和 rootScope 是兄弟姐妹。两者都是 $rootScope 的子级,并且顾名思义,它们之间没有父子关系。(如果您希望 rootScope 成为实际且唯一的 rootScope 而不是仅使用 rootScope = $rootScope)。

看看你的 $emit:你提供了一个空的 Array [] 作为附加参数,但在你的事件处理程序中你期望至少一个元素 files[0] 并将它用作 Files.saveFileApi(files[0] ...)

据我所知,您的 eventHandler 将被调用但崩溃。

【讨论】:

  • 谢谢,改变这两个东西修复了它,我想我有一个星期五的时刻......
猜你喜欢
  • 1970-01-01
  • 2022-10-20
  • 2013-10-12
  • 2020-09-12
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多