gpt4 book ai didi

ruby-on-rails - 具有属性的 rspec stub any_instance

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

我需要对具有特定属性或属性集的模型的所有实例进行 stub 。例如,使用 ActiveRecord:

let(:model1) { Model.create!(uid: 1) }
let(:model2) { Model.create!(uid: 2) }

before do
allow(model1).to receive(:foo).and_return :bar
allow(model2).to receive(:foo).and_return :baz
end

it do
expect(model1.foo).to eq :bar # => passes
expect(model2.foo).to eq :baz # => passes

################################################
#### Here is the issue I'm trying to solve: ####
################################################
new_instance_of_model1 = Model.find_by(uid: 1)
new_instance_of_model2 = Model.find_by(uid: 2)

expect(new_instance_of_model1.foo).to eq :bar # => fails
expect(new_instance_of_model2.foo).to eq :baz # => fails
end

有什么方法可以 stub Model 的所有 uid: 1 实例吗?

我正在寻找类似的东西:

allow_any_instance_of(Model).with_attributes(uid: 1).to receive(:foo).and_return(:bar)
allow_any_instance_of(Model).with_attributes(uid: 2).to receive(:foo).and_return(:baz)

注意事项:

我不能使用类似的东西:

allow(Model).to receive(:find).with(1)and_return(model1)
allow(Model).to receive(:find).with(2)and_return(model2)

因为还有许多其他方法可以访问模型(关联、作用域、Arel 等)

最佳答案

这不是一个好主意,但您可以通过将 block 参数传递给 receive 而不是方法链来实现此目的,如下所示:

allow_any_instance_of(Model).to receive(:foo) do |model|
case model.uid
when 1
:bar
when 2
:baz
end
end

关于ruby-on-rails - 具有属性的 rspec stub any_instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43131922/

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