我有一个模型 Family,其方法 location
合并了其他对象 Members 的 location
输出。 (成员与家庭相关联,但这在这里并不重要。)
例如给定
- member_1 有
位置
== '圣地亚哥(旅行,5 月 15 日返回)' - member_2 有
位置
== '圣地亚哥'
Family.location 可能会返回“圣地亚哥(member_1 旅行,5 月 15 日返回)”具体情况并不重要。
为了简化 Family.location 的测试,我想 stub Member.location。但是,我需要它返回两个不同的(指定的)值,如上例所示。理想情况下,这些将基于 member
的属性,但只需按顺序返回不同的值就可以了。有没有办法在 RSpec 中做到这一点?
可以在每个测试示例中覆盖 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 运行一系列示例时,它不会恢复原始类,因此这种覆盖“毒害”了后续示例。
那么,有没有办法让 stub 方法在每次调用时返回不同的指定值?
最佳答案
您可以 stub 一个方法以在每次调用时返回不同的值;
allow(@family).to receive(:location).and_return('first', 'second', 'other')
因此,您第一次调用 @family.location
时,它将返回“first”,第二次将返回“second”,随后所有调用它,它将返回“other” '.
关于ruby-on-rails - RSpec stub 方法可以按顺序返回不同的值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947999/