Javascript 如何为Jasmine spy上的多个调用提供不同的返回值

Javascript 如何为Jasmine spy上的多个调用提供不同的返回值,javascript,unit-testing,jasmine,Javascript,Unit Testing,Jasmine,假设我在监视这样一种方法: spyOn(util, "foo").andReturn(true); 被测函数多次调用util.foo 是否可以让spy在第一次调用时返回true,但在第二次调用时返回false?或者有不同的方法吗?对于较早版本的Jasmine,您可以使用Jasmine 1.3或Jasmine 2.0,并且您必须通过简单的闭包或对象属性等来跟踪“被调用”状态 var alreadyCalled = false; spyOn(util, "foo").andCallFake(fun

假设我在监视这样一种方法:

spyOn(util, "foo").andReturn(true);
被测函数多次调用
util.foo


是否可以让spy在第一次调用时返回
true
,但在第二次调用时返回
false
?或者有不同的方法吗?

对于较早版本的Jasmine,您可以使用Jasmine 1.3或Jasmine 2.0,并且您必须通过简单的闭包或对象属性等来跟踪“被调用”状态

var alreadyCalled = false;
spyOn(util, "foo").andCallFake(function() {
    if (alreadyCalled) return false;
    alreadyCalled = true;
    return true;
});
您可以使用(如Jasmine 2.4)

比如说

description(“间谍,当配置为伪造一系列返回值时”,function()){
beforeach(函数(){
spyOn(util,“foo”).和.returnValue(true,false);
});
它(“多次调用时按顺序返回请求的值”,function(){
expect(util.foo()).toBeTruthy();
expect(util.foo()).toBeFalsy();
expect(util.foo()).tobeundefine();
});
});

有一件事你必须小心,有另一个函数将类似地拼写
returnValue
,没有
s
,如果你使用它,jasmine不会警告你。

我们可以将它扩展到两个以上的调用,比如:var results=[true,false,“foo”];var callCount=0;spyOn(util,“foo”).and.callFake(函数(){返回结果[callCount++];});这可以扩展成一个通用函数,比如:函数returnValues(){var args=arguments;var callCount=0;返回函数(){return args[callCount++];};}当您只返回结果时,为什么要完整地编写这段代码呢,因为我们可以根据调用顺序抛出错误或返回值。不过,有一点要警告-小心不要忘记
.returnValues
中的“s”-这两个函数显然不同,但将多个参数传递给
。returnValue
不会引发错误。“我不想承认我因为那一个角色浪费了多少时间。@TheDIMMReaper,谢谢你。”。我现在提到了,在beforeach中做这件事对我来说很重要,而不是在测试中。当然,在打字稿中使用jasmine时,不必担心拼写错误。