RSpec:带有参数的存根链?

发布于 2024-12-13 08:46:08 字数 532 浏览 1 评论 0原文

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

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

在我的控制器规范中,我希望能够删除这两种方法并返回不同的结果。如果操作中只有 @paids 字段,我会使用类似的内容

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

,但是当然,这将为 @bad_ payments 返回相同的值。

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

Just wondering if/how arguments can be passed in rspec stub chains. To give an example, suppose I have the following action:

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

In my controller spec, I'd like to be able to stub out both methods and return different results. If only the @payments field were in the action I'd use something like

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

But of course, that will return the same value for @bad_payments.

So - in short, how do I include the :updated_at and :paid => true as stub conditions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你的笑 2024-12-20 08:46:08

你可以使用这个:

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

You can use this:

Payment.stub_chain(:order, :where).with(:updated_at).with(:paid => true) { return_this }
但可醉心 2024-12-20 08:46:08

与 rspec > 3 使用以下语法:

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

而不是 stub_chain

文档中了解有关消息链的更多信息这里是参数匹配器文档。

With rspec > 3 use this syntax:

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

instead of stub_chain.

Read more about message chains in the documenation. And here is the argument matchers documentation.

拥抱没勇气 2024-12-20 08:46:08

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

我使用 tap 因为 stub 不返回被调用者。由 double 创建的 mock 作为方法 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}]

You can use nested stub block. The block can accept arguments, and the return value is used as function return value.

I use tap because stub does not returns the callee. The mock created by double is returned as the result of method order, which where method is stub again.

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}]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文