我正在使用“controller as”语法来创建我的控制器.我有一个私有初始化函数,它调用一个函数来加载默认数据.
var app = angular.module('plunker',[]); app.controller('MainCtrl',function($scope) { var mc = this; mc.dataLoaded = false; function init() { mc.loadData(); } mc.loadData = function(){ mc.dataLoaded = true; } init(); });
在我的测试中,我正在创建一个间谍来检查是否已经调用了loadData函数.虽然我可以通过测试mc.dataLoaded标志来验证函数是否被调用,但是我的间谍似乎没有记录被调用的函数.如何让间谍正确记录函数调用?
describe('Testing a Hello World controller',function() { var $scope = null; var ctrl = null; //you need to indicate your module in a test beforeEach(module('plunker')); beforeEach(inject(function($rootScope,$controller) { $scope = $rootScope.$new(); ctrl = $controller('MainCtrl as mc',{ $scope: $scope }); spyOn($scope.mc,'loadData').and.callThrough(); })); it('should call load data',function() { expect($scope.mc.loadData).toHaveBeenCalled(); //expect($scope.mc.dataLoaded).toEqual(false); }); });
这一系列的线条:
ctrl = $controller('MainCtrl as mc',{ $scope: $scope }); spyOn($scope.mc,'loadData').and.callThrough();
意味着在控制器已经由$controller实例化之后创建了Jasmine间谍.在创建间谍之前,init函数已经执行.
你不能切换任何一条线,因为MainCtrl需要存在才能监视它上面的方法.
如果init函数调用另一个服务,则监视该服务的方法并声明该服务被正确调用.如果MainCtrl只是在内部执行某些操作,那么请测试其结果,例如,断言控制器的数据/属性已更新.如果它足够微不足道,它甚至可能不值得测试.
此外,由于您使用控制器作为语法,您可以通过调用$controller的返回值来引用控制器,而不是直接访问范围:
ctrl = $controller('MainCtrl as mc',{ $scope: $scope }); ctrl.loadData === $scope.mc.loadData; // true