我可以将提供的函数中的原始方法调用为Jasmine间谍的"andCallFake"吗?

Ser*_*iuB 4 jasmine

我可以将原始方法保存在beforeEach中的变量中,然后在afterEach中恢复它,但也许我可以使用一个间谍,它将在测试套件之间自动重置.

spyOn(Ext, "create").andCallFake(function(className){
    if (className === 'Waf.view.Viewport')
        // call the original Ext.create method
});
Run Code Online (Sandbox Code Playgroud)

这可能吗?我正在使用Jasmine 1.3

ale*_*mce 7

您可以将原始方法绑定到假方法中:

var obj = {
  method: function(name) { return name + '!'; }
}

var methodFake = function(original, name) {
  return 'faked ' + original(name);
}.bind(obj, obj.method)
spyOn(obj, 'method').andCallFake(methodFake);

obj.method('hello') // outputs 'faked hello!'
Run Code Online (Sandbox Code Playgroud)

就其价值而言,我认为这样做不是很好的做法,但是最近在我测试一些 d3 代码时出现了这种需求。希望能帮助到你。


Alt*_*852 5

这是Jasmine 2.3的黑客攻击.理想情况下,假回调应该可以访问原始函数的引用,以便根据需要调用而不是像这样跳舞.

鉴于可以在Jasmine 2.3中即时修改存根策略,以下方法似乎也可以使用:

var createSpy = spyOn(Ext, "create");
createSpy.and.callFake(function(className){
    if (className === 'Waf.view.Viewport'){
        createSpy.and.callThrough();
        Ext.create(className);        
    }
});
Run Code Online (Sandbox Code Playgroud)


Ser*_*iuB -1

我最终做了这样的事情:

var origFunc = Ext.create;
spyOn(Ext, "create").andCallFake(function(className, classConfig){
    if (className === 'Waf.view.Viewport') {
         return {};
    } else {
         return origFunc.apply(null, arguments);
    }
});
Run Code Online (Sandbox Code Playgroud)