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替换它。注意到区别了吗?在本例中,您没有要监视的依赖项——您只需要一个跟踪调用的对象(间谍)。