RSpec:带有参数的Stub链?

Pla*_*Ton 31 rspec ruby-on-rails stub

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

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

在我的控制器规范中,我希望能够存根两种方法并返回不同的结果.如果只有@payments场地在行动中,我会使用类似的东西

Payment.stub_chain(:order, :where) { return_this }
Run Code Online (Sandbox Code Playgroud)

但是,当然,这将返回相同的值@bad_payments.

那么 - 简而言之,我如何包含:updated_at:paid => true作为存根条件?

小智 23

你可以用这个:

Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }
Run Code Online (Sandbox Code Playgroud)

  • 这不起作用.似乎````参数被忽略了.尝试将其更改为应该失败并仍将通过的内容. (7认同)

cze*_*asz 17

随着rspec > 3使用的语法如下:

expect(Converter).to receive_message_chain("new.update_value").with('test').with(no_args)
Run Code Online (Sandbox Code Playgroud)

而不是stub_chain.

阅读有关文档中消息链的更多信息.而这里是参数的匹配文档.

  • 这似乎不起作用.对`with`的第一次调用被忽略. (2认同)

Ian*_*ang 16

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

我使用tap因为stub不返回被调用者.创建的模拟double作为方法的结果返回order,该where方法再次为存根.

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}]
Run Code Online (Sandbox Code Playgroud)