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 }