RSpec存根方法可以按顺序返回不同的值吗?

我有一个模型家庭与方法location合并其他对象,成员的location输出。 (会员与家庭有关,但在这里并不重要。)

例如,给出

  • member_1的location =='圣地亚哥(旅行,返回5月15日)'
  • member_2有location =='圣地亚哥'

Family.location可能会返回'圣地亚哥(member_1旅行,返回5月15日)'具体是不重要的。

为了简化Family.location的testing,我想存根Member.location。 但是,我需要它返回两个不同的(指定)值,如上例中。 理想情况下,这些将基于member的属性,但只是按顺序返回不同的值是可以的。 有没有办法在RSpec中做到这一点?

可以在每个testing示例中重写Member.location方法,例如

 it "when residence is the same" do class Member def location return {:residence=>'Home', :work=>'his_work'} if self.male? return {:residence=>'Home', :work=>'her_work'} end end @family.location[:residence].should == 'Home' end 

但我怀疑这是好的做法。 无论如何,当RSpec运行一系列的例子时,它不会恢复原来的类,所以这种覆盖“毒化”后续的例子。

那么,是否有一种方法来让每个调用中的stubbed方法返回不同的指定值?

每次调用方法时,可以存根方法来返回不同的值;

 allow(@family).to receive(:location).and_return('first', 'second', 'other') 

所以第一次你打电话给@family.location会返回'first',第二次会返回'second',随后你调用它,它会返回'other'。

RSpec 3语法:

 allow(@family).to receive(:location).and_return("abcdefg", "bcdefgh") 

如果由于某种原因你想使用旧的语法,你仍然可以:

 @family.stub(:location).and_return('foo', 'bar') 

我已经尝试了上面的解决scheme大纲,但它不适用于我的。 我通过替代实现来解决问题。

就像是:

 @family.stub(:location) { rand.to_s }