2015-11-13 71 views
0

我想測試一個正在調用服務的控制器。當這個服務完成它的工作時,它將使用$ 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方法不會被調用,所以它失敗。我不確定它是否與我繼承範圍的方式有關,但我已經嘗試了幾種替代方案

謝謝!

+0

謝謝,我遇到了rootScope./scope關係的問題。同時感謝您指出了不必要的$ apply調用,實際上它們全部被刪除 –

回答

1

可能是它有助於澄清你的測試正在做的:。

在你beforeEach節創建範圍= $ rootScope $新的()和rootScope = $ rootScope $新的()。這樣,範圍和rootScope是兄弟姐妹。兩者都是$ rootScope的子項,並且它們之間沒有父子關係(如果您希望rootScope成爲僅使用rootScope = $ rootScope的實際和唯一的rootScope)。

看看你的$ emit:你提供一個空的Array []作爲附加參數,但是在你的事件處理函數中,你期望至少有一個元素文件[0]並將它用作Files.saveFileApi(文件[0 ] ...)

據我所見,你的eventHandler將被調用,但崩潰。

+0

謝謝,修改了這兩個東西,我認爲我有一個星期五的時刻... –