ruby-on-rails - RSpec stub 方法可以按顺序返回不同的值吗?

标签 ruby-on-rails testing rspec stub

我有一个模型 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/

相关文章:

ruby-on-rails - 连接表中的记录在 HABTM 关联中自动销毁?

mysql - Rails 4 的数据网格范围关于组和顺序

ruby-on-rails - 如何在 Rails 3 中制作 RSS/Atom 提要?

ruby-on-rails - rspec 大十进制匹配器

ruby-on-rails - 如何将 RSPEC 配置为从不在 RAILS_ENV 生产环境中运行

ruby-on-rails - rails : loop comparing two arrays and pushing matches to new array

testing - 功能无法访问 Rspec 帮助程序方法

ruby-on-rails - 是否值得尝试尽可能多地重用测试夹具?

haskell - tasty-discover with stack run 0 测试

Ruby:直接运行时规范通过,在 Guard 中运行时出现 TypeError