gpt4 book ai didi

ruby-on-rails - 如何让 instance_of 与 RoR 中的 ActiveRecord 对象一起工作?

转载 作者:行者123 更新时间:2023-11-28 20:47:35 25 4
gpt4 key购买 nike

今天我遇到了使用 RoR 对 AR 对象进行 stub 调用的问题。我认为我可以按照以下方式做一些事情:

stub.instance_of(BankAccount).save_to_other_spot { true }

然而,当我尝试这个方法时,它似乎根本没有 stub 该方法,它最终会运行我试图 stub 的原始方法。我使用调试器等确认了这一点。

所以我最终使用了以下方法:

stub.proxy(BankAccount).find(anything) do |account|
stub(account).save_to_other_spot { true }
account
end

这行得通。

我想知道我是否做错了什么?为什么 instance_of 没有按我期望的方式工作?

我遇到的另一个问题是,在我的 RSpec 测试中,我似乎必须为每个请求设置我的模拟和 stub 。再一次,这是正常的还是我做错了什么?

我的意思是我必须做类似的事情:

... mock and stub ...
get :show, :id => @id

... mock and stub ...
post :update, :id => id, :account => { ... params ... }

我以为我可以在顶部进行一次模拟和 stub 。

最佳答案

假设您正在运行 RSpec >2.5... 那么模拟/ stub 语法已得到改进,因此您现在可以使用以下定义。

BankAccount.any_instance.stub(:save_to_other_spot) { true }

请注意,您需要使用 a latter version of RSpec . RSpec 的早期版本不包含 any_instance 方法。看起来他们是从 Mocha 那里借来的,并将其实现到 RSpec 模拟中。

如果您使用的是旧版本的 RSpec,那么我认为您正在做的是唯一的方法。只是我倾向于这样写:

@bank_account = BankAccount.new
BankAccount.stub(:find) { @bank_account }
@bank_account.stub(:save_to_other_spot) { true }

尽管我认为您的 block 方法看起来更干净。

关于ruby-on-rails - 如何让 instance_of 与 RoR 中的 ActiveRecord 对象一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2361884/

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