Angularjs 如何在每个代码块之前监视Jasmine内部创建的函数?
这是我的代码:Angularjs 如何在每个代码块之前监视Jasmine内部创建的函数?,angularjs,jasmine,karma-jasmine,Angularjs,Jasmine,Karma Jasmine,这是我的代码: describe('Factory: BaseService', function() { var fctry, mockBackend; beforeEach(function() { module('BaseApp'); cb = function() {}; inject(function(_BaseService_, _$httpBackend_) { mockBackend
describe('Factory: BaseService', function() {
var fctry, mockBackend;
beforeEach(function() {
module('BaseApp');
cb = function() {};
inject(function(_BaseService_, _$httpBackend_) {
mockBackend = _$httpBackend_;
BaseService = _BaseService_;
});
});
it('logout() should POST to /logout', function() {
spyOn(BaseService, 'accessErrors').and.callThrough();
spyOn('cb');
mockBackend.expectPOST("/logout").respond(404, {msg: 'Not Found'});
BaseService.logout(cb);
mockBackend.flush();
expect(BaseService.accessErrors).toHaveBeenCalled();
expect(BaseService.cerrorMessages).toEqual(['Not Found']);
expect(cb).toHaveBeenCalled();
});
});
当我运行这个测试时,我得到一个错误,它说:
Chromium 48.0.2564 (Ubuntu 0.0.0) Factory: BaseService logout() should POST to /logout FAILED
Error: No method name supplied
它指向一行
spyOn('cb')
。监视在每个代码块之前创建的函数的正确方法是什么?您只能监视对象,这就是为什么spyOn的语法是:
objFoo = {};
objFoo.funcBar = function() {};
spyOn(objFoo, 'funcBar');
因此,创建一个包含函数的对象
或者监视窗口,将cb视为全局变量:
spyOn(window, 'cb');
虽然这并不是真正的建议:-)通常,应该使用
spyOn
来删除依赖项——对我来说,监视在测试本身中定义的函数似乎很奇怪
在这种情况下,我可能只是创建一个间谍并将其传递给BaseService.logout
直接:
it('logout() should POST to /logout', function() {
spyOn(BaseService, 'accessErrors').and.callThrough();
// just create the spy here -- no need to create a function so you can replace
// it with a spy via spyOn :-).
var cb = jasmine.createSpy('cb');
mockBackend.expectPOST("/logout").respond(404, {msg: 'Not Found'});
BaseService.logout(cb);
mockBackend.flush();
expect(BaseService.accessErrors).toHaveBeenCalled();
expect(BaseService.cerrorMessages).toEqual(['Not Found']);
expect(cb).toHaveBeenCalled();
});
谢谢快速提问,你所说的“通常,应该使用spyOn删除依赖项”到底是什么意思?spyOn不是用来监视对象以查看它们是否被调用,以及它们被调用的内容吗?您所描述的是间谍的功能
spyOn
获取依赖项(例如,连接到控制器或服务或…)的函数,并在测试期间用spy替换它。注意到区别了吗?在本例中,您没有要监视的依赖项——您只需要一个跟踪调用的对象(间谍)。