我正在尝试在Jasmine中执行以下操作,但不确定是否可能:

我使用两种方法A和B获得了服务对象。
方法A调用方法B(实际上B是一个$ http调用,我在测试期间不想执行:我想模拟它)。

在我的BeforeEach部分中,我这样做:
spyOn(Serviceinstance, 'B').and.callFake(function(){ return true; });

在我的测试中:

var result = Serviceinstance.A();
expect(result).toBeTrue();


当然,B的真实代码返回false。
我的问题是我的测试总是失败。间谍提供的功能永远不会被方法A调用。
另一方面,如果我这样叫B:

var result = Serviceinstance.B();


然后调用了间谍的功能,我的测试通过了。

所以我应该像这样修改我的实例:

Serviceinstance.B = function(){return true;}


因为Jasmine无法模拟调用堆栈的“第二”级别? (对我来说似乎完全不可能)

我一定会错过一些东西。

最佳答案

这是一个有效的代码:

describe('Service test suite', function() {
    it('should return true', function() {
        var Serviceinstance = new Service();
        spyOn(Serviceinstance, 'B').and.callFake(function() {
            return true;
        });
        expect(Serviceinstance.A()).toBe(true);
    })
});


https://jsfiddle.net/ronapelbaum/9moLhhbr/

10-05 20:40