【发布时间】: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