我正在使用“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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。