Jasmine angularjs - 监视控制器初始化时调用的方法
问题描述:
我目前使用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
并将其传递给测试控制器。但是,当我探讨这种方法时,看起来我仍然会遇到同样的问题,不管它是否是模拟的。任何人有任何想法或可以指向我的资源正确的方式来处理这个问题?
答
在编写单元测试时,应该隔离每段代码。在这种情况下,您需要隔离您的服务并单独进行测试。创建服务的模拟并将其传递给您的控制器。
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调用。
感谢Destron,我最终嘲笑这些服务,终于能够让间谍发现被调用的方法。 – 2013-04-08 18:05:00
@JonathanPalumbo请你和我们分享一下你最终做了什么测试。 – 2015-06-09 01:26:03