gpt4 book ai didi

ruby-on-rails - 如何在 RSpec 中 stub 两个链接的 ActiveRecord 方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:45 25 4
gpt4 key购买 nike

我有一段代码是这样的:

Green::Trees.where(id: ids).find_each do |tree|
tree.grow!
end

stub find_each 的好方法是什么,以便在每次迭代中,它返回一棵我在 let block 中定义的树,如下所示:

let(:tree) { create(:tree) }
let(:tree_ids) { [tree.id] }

我能做什么?

我应该这样做吗?

allow(Green::Tree).to receive(:where).and_return(Green::Tree)
allow(Green::Tree).to receive(:find_each).and_yield(tree)

最佳答案

RSpec 为您提供了两种 stub 链接方法调用的方法。

简洁的方式是receive_message_chain:

allow(Green::Trees).to receive_message_chain(:where, :find_each).and_yield(tree)

然而,这不允许您指定参数,尽管这样做通常并不重要。

如果你关心参数,你可以这样做:

results = double
allow(Green::Tree).to receive(:where).with(id: ids).and_return(results)
allow(results).to receive(:find_each).and_yield(tree)

您编写的内容会起作用,但它是不正确的,因为 where 不返回类 Green::Tree,而是返回一个 ActiveRecord 关系。 Green::Tree 确实实现了 find_each,但它是一种与关系上的方法同名的不同方法。非常困惑!

关于ruby-on-rails - 如何在 RSpec 中 stub 两个链接的 ActiveRecord 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com