【问题标题】:RSpec: Stub chains with arguments?RSpec:带参数的存根链?
【发布时间】:2011-12-21 15:39:37
【问题描述】:

只是想知道参数是否/如何在 rspec 存根链中传递。举个例子,假设我有以下动作:

def index
  @payments = Payment.order(:updated_at).where(:paid => true)
  @bad_payments = Payment.order(:some_other_field).where(:paid => false)
end

在我的控制器规范中,我希望能够对这两种方法进行存根处理并返回不同的结果。如果只有@payments 字段在操作中,我会使用类似

Payment.stub_chain(:order, :where) { return_this }

当然,这将为 @bad_payments 返回相同的值。

所以 - 简而言之,我如何将 :updated_at:paid => true 作为存根条件包含在内?

【问题讨论】:

标签: ruby-on-rails rspec stub


【解决方案1】:

你可以用这个:

Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }

【讨论】:

  • 这真的行不通。似乎 with 参数被忽略了。尝试将其更改为应该失败但仍会通过的内容。
  • @Zubin 是对的,我尝试将 with 更改为任意值,并且没有抛出错误,这意味着 with 调用被忽略。
  • 这在新的 rspec 版本中已被弃用。
【解决方案2】:

您可以使用嵌套存根块。块可以接受参数,返回值作为函数返回值。

我使用tap 因为stub 不返回被调用者。 double 创建的 mock 作为方法 order 的结果返回,where 方法又是 stub。

Payment.stub(:order) { |order|
  double('ordered_payments').tap { |proxy|
    proxy.stub(:where) { |where|
      [order, where]
    }
  }
}

Payment.order(:updated_at).where(:paid => true)
# => returns [:updated_at, {:paid => true}]

【讨论】:

    【解决方案3】:

    rspec > 3 使用以下语法:

    expect(Converter).to receive_message_chain("new.update_value").with('test').with(no_args)
    

    而不是stub_chain

    阅读有关消息链的更多信息in the documenationhere 是参数匹配器文档。

    【讨论】:

    • 这似乎不起作用。对with 的第一次调用被忽略。
    • 是的,我也遇到了同样的问题。第一个 with() 方法中的 args 未经过测试。你们找到解决办法了吗?
    • 在提到的文档中,withreceive_message_chain 无关。
    • 这应该是公认的解决方案,因为当前的例外解决方案在新的 rspec 版本中已弃用。
    猜你喜欢
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多