我已经看到了这个问题的一组重复但无法解决问题。
我有一个控制器,在控制器初始化期间,首先调用fetchtemplate(),然后调用我的mock fetchtemplate()。
如何在控制器初始化期间停止调用实际(控制器)fetchtemplate()?我的目的是在我的spec中模拟函数fetchtemplate()。请看看我的规范 -
describe("...",function(){
beforeEach(inject(function($controller,...) {
scope = $rootScope.$new();
this.init = function() {
$controller('ChangeControlCreateController', {
$scope: scope
});
}
}));
describe('Function', function() {
it("-- check for trueness",function(){
this.init() ; //Initialization of the controller
spyOn(scope,'fetchtemplate').and.callFake(function() {
return 101;
});
var fakeResponse = scope.fetchtemplate();
expect(scope.fetchtemplate).toHaveBeenCalled();
expect(fakeResponse).toEqual(101);
});
});
});
我已经尝试将spyOn放在this.init()
之前,因为fetchtemplate()
当时不存在错误而导致错误。
我的控制器代码结构如下 -
angular.module('...', [...])
.controller('ChangeControlCreateController', ["$scope"...,
function ChangeControlCreateController($scope,...) {
$scope.fetchtemplate = function() {
console.log("controller's function");
...
};
$scope.fetchtemplate();
});
我得到的结果是 - 首先是控制台项目"控制器的功能"然后使用mock函数执行规范。我希望mock函数执行而不用执行控制器的函数
答案 0 :(得分:1)
因此,如果我理解正确,您正在调用一个函数,该函数正在执行您希望阻止测试的功能。可能是一个http电话或某种东西?
无论它做什么,处理类似事情的正确方法通常是将该方法放入服务中,然后监视该服务方法。以下是测试服务是否为TemplateService的示例:
describe("...",function(){
var $controller, scope, TemplateService, YourController;
beforeEach(inject(function(_$controller_, _TemplateService_, ...) {
scope = $rootScope.$new();
$controller = _$controller_;
TemplateService = _TemplateService_;
}
it("-- check for trueness",function(){
spyOn(TemplateService,'fetchTemplate').and.returnValue('101');
YourController = $controller('YourController');
expect(...);
});
});
我希望这很有用