我想測試一個正在調用服務的控制器。當這個服務完成它的工作時,它將使用$ 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調用,實際上它們全部被刪除 –