2013-04-05 49 views
4

我目前使用Jasmine和Karma(Testacular)和Web Storm来编写单元测试。我无法监视在控制器初始化时立即调用的方法。是否可以窥探控制器初始化时调用的方法?Jasmine angularjs - 监视控制器初始化时调用的方法

我的控制器代码,我试图窥视的方法是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并将其传递给测试控制器。但是,当我探讨这种方法时,看起来我仍然会遇到同样的问题,不管它是否是模拟的。任何人有任何想法或可以指向我的资源正确的方式来处理这个问题?

回答

5

在编写单元测试时,应该隔离每段代码。在这种情况下,您需要隔离您的服务并单独进行测试。创建服务的模拟并将其传递给您的控制器。

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调用。

+0

感谢Destron,我最终嘲笑这些服务,终于能够让间谍发现被调用的方法。 – 2013-04-08 18:05:00

+0

@JonathanPalumbo请你和我们分享一下你最终做了什么测试。 – 2015-06-09 01:26:03

相关问题