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

例如,给定

  • 成员_1有location=="圣地亚哥(旅行,5月15日返回)"
  • 成员2有location个=='San Diego'

家庭地点可能会返回"圣地亚哥(会员1旅行,5月15日返回)",具体细节并不重要.

简化家庭测试.地点,我想登记会员.地方但是,我需要它返回两个不同的(指定的)值,如上面的示例所示.理想情况下,这些将基于属性member,但只需在序列中返回不同的值就可以了.在RSpec中有没有办法做到这一点?

可以覆盖该成员.例如,在每个测试位置,例如

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运行一系列示例时,它不会恢复原始类,因此这种重写会"毒害"后续示例.

那么,有没有办法让存根方法在每次调用时返回不同的指定值?

推荐答案

你可以存根一个方法,每次调用它时都返回不同的值;

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

因此,第一次调用@family.location时,它将返回"first",第二次将返回"second",随后所有调用它的时间,它将返回"other".

Ruby-on-rails相关问答推荐

Rails turbo流只更新页面上的一个元素

本地主机的上衣配置

Rails 6升级没有加载Mongoid,这是一个问题

刺激中的Rails 7和 bootstrap 错误-无法解析模块说明符 bootstrap

根据表单内的 Select 字段值渲染部分内容

Rails 7.0.4 和 link_to 的数据确认不起作用

序列化来自关联的不可变数据是个好主意吗?

在bash中匹配带有空格字符的字符串

正确更新其他列的更新列

Rails 连接并包含连接表中的列

ArgumentError:您需要使用 :if 提供至少一个验证

rails s和bundle exec rails s有什么区别?

使用devise gem点击确认链接后避免登录?

rails 4.0, rake db:sessions:create

适合mysql比较的Ruby datetime

Rails:使用 link_to 创建不带 href 的链接

在 Rails 路由中更改 id 参数

为什么不对 Rspec + Selenium 使用共享的 ActiveRecord 连接?

Rails:每个环境的初始化程序?

在 Ruby on Rails 中设置日志(log)记录级别