簡體   English   中英

Jasmine angularjs - 監視控制器初始化時調用的方法

[英]Jasmine angularjs - spying on a method that is called when controller is initialized

我目前正在使用Jasmine與Karma(Testacular)和Web Storm編寫單元測試。 我在查看控制器初始化時立即調用的方法時遇到問題。 是否可以監視控制器初始化時調用的方法?

我的控制器代碼,我試圖窺探的方法是getServicesNodeList()

myApp.controller('TreeViewController', function ($scope, $rootScope ,$document, DataServices) {
    $scope.treeCollection  =  DataServices.getServicesNodeList();
    $rootScope.viewportHeight = ($document.height() - 100) + 'px';
});

這是測試規范:

describe("DataServices Controllers - ", function () {

beforeEach(angular.mock.module('myApp'));
describe("DataServicesTreeview Controller - ", function () {


    beforeEach(inject(function ($controller, $rootScope, $document, $httpBackend, DataServices) {
        scope = $rootScope.$new(),
        doc = $document,
        rootScope = $rootScope;
        dataServices = DataServices;

        $httpBackend.when('GET', '/scripts/internal/servicedata/services.json').respond(...);

        var controller = $controller('TreeViewController', {$scope: scope, $rootScope: rootScope, $document: doc, DataServices: dataServices });

        $httpBackend.flush();
    }));

    afterEach(inject(function($httpBackend){
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    }));

    it('should ensure DataServices.getServicesNodeList() was called', inject(function ($httpBackend, DataServices) {
        spyOn(DataServices, "getServicesNodeList").andCallThrough();

        $httpBackend.flush();
        expect(DataServices.getServicesNodeList).toHaveBeenCalled();
    }));


});
});

測試失敗說沒有調用該方法。 我知道我應該模擬DataServices並將其傳遞給測試控制器。 但似乎我在監視該方法時仍會遇到同樣的問題,無論是否是模擬。 任何人有任何想法或可以指出我正確處理這個問題的資源?

編寫單元測試時,應該隔離每段代碼。 在這種情況下,您需要隔離您的服務並單獨測試它。 創建服務的模擬並將其傳遞給您的控制器。

var mockDataServices = {
    getServicesNodeList: function () {
        return <insert your sample data here > ;
    }
};

beforeEach(inject(function ($controller, $rootScope, $document) {
    scope = $rootScope.$new(),
    doc = $document,
    rootScope = $rootScope;

    var controller = $controller('TreeViewController', {
        $scope: scope,
        $rootScope: rootScope,
        $document: doc,
        DataServices: mockDataServices
    });
}));

如果是您的服務正在發出$ http請求,您可以從單元控制器測試中刪除該部分。 編寫另一個單元測試,測試服務在初始化時正在進行正確的http調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM