Rspec 无法对 where 或 find_by_ 进行存根,只能找到
Rspec can't stub where or find_by_, only find
我将分享几对运行代码和测试代码。基本上,只有当我在对象 class 上使用 find
时,测试代码才有效,但问题是 find
是我不想使用的一种方法,因为我不是在寻找主键!
方法 1:用 Plan.all
存根 :where
以便首先可以调用它
#run code
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first
#test code
@plan = Plan.new #so this is the first Plan that I'd like to find
Plan.stub(:where).and_return(Plan.all)
#result of @current_plan (expecting @plan)
=> nil
方法 2:链存根 :where
和 :first
#run code
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first
#test code
@plan = Plan.new #so this is the first Plan that I'd like to find
Plan.stub_chain(:where, :first).and_return(@plan)
#result of @current_plan (expecting @plan)
=> nil
方法 3:存根自定义 :find_by
#run code
@current_plan = Plan.find_by_stripe_subscription_id(event.data.object.lines.data.first.id)
#test code
@plan = Plan.new
Plan.stub(:find_by_stripe_subscription_id).and_return(@plan)
#result of @current_plan (expecting @plan)
=> nil
方法 4:存根 :find
可行!但是我无法通过主键找到...所以我理想情况下需要方法 3 才能工作...
#run code
@current_plan = Plan.find(2) #for giggles, to make sure the stub is ignoring the 2 argument
#test code
@plan = Plan.new
Plan.stub(:find).and_return(@plan)
#result of @current_plan (expecting @plan)
=> @plan
我想另一个答案是我如何创造性地使用 :find
和参数,即使我知道这不是最佳实践...
好吧,我有一个临时解决方案,就是使用select。即,
#run code
@current_plan = Plan.select { |p| p.stripe_subscription_id == event.data.object.lines.data.first.id }.first
#test code
@plan = Plan.new
Plan.stub_chain(:select, :first).and_return(@plan)
#result of @current_plan (expecting @plan)
=> @plan
不过...如果其他人有想法,请插话...我现在有点学术上好奇为什么 where
或 where, first
存根不起作用。
find_by_stripe_subscription_id
,我做了一些更多的测试,甚至在自定义 find_by
方法上,方法的预期也会失败,所以存根当然不会起作用。但是,请看下面 Zetetic 的回答,也许只有我才是众神讨厌的......
您可以存根这些方法。所有这些测试都通过了:
require 'rails_helper'
RSpec.describe Foo, type: :model do
let(:foo) { double(name: "foo") }
it "works with find" do
expect(Foo).to receive(:find).and_return(foo)
expect(Foo.find(1)).to eq foo
end
it "works with find_by" do
expect(Foo).to receive(:find_by_name).and_return(foo)
expect(Foo.find_by_name("foo")).to eq foo
end
it "works with where" do
expect(Foo).to receive(:where).and_return([ foo ])
expect(Foo.where(name: "foo")).to eq [foo]
end
end
我将分享几对运行代码和测试代码。基本上,只有当我在对象 class 上使用 find
时,测试代码才有效,但问题是 find
是我不想使用的一种方法,因为我不是在寻找主键!
方法 1:用 Plan.all
存根 :where
以便首先可以调用它
#run code
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first
#test code
@plan = Plan.new #so this is the first Plan that I'd like to find
Plan.stub(:where).and_return(Plan.all)
#result of @current_plan (expecting @plan)
=> nil
方法 2:链存根 :where
和 :first
#run code
@current_plan = Plan.where(stripe_subscription_id: event.data.object.lines.data.first.id).first
#test code
@plan = Plan.new #so this is the first Plan that I'd like to find
Plan.stub_chain(:where, :first).and_return(@plan)
#result of @current_plan (expecting @plan)
=> nil
方法 3:存根自定义 :find_by
#run code
@current_plan = Plan.find_by_stripe_subscription_id(event.data.object.lines.data.first.id)
#test code
@plan = Plan.new
Plan.stub(:find_by_stripe_subscription_id).and_return(@plan)
#result of @current_plan (expecting @plan)
=> nil
方法 4:存根 :find
可行!但是我无法通过主键找到...所以我理想情况下需要方法 3 才能工作...
#run code
@current_plan = Plan.find(2) #for giggles, to make sure the stub is ignoring the 2 argument
#test code
@plan = Plan.new
Plan.stub(:find).and_return(@plan)
#result of @current_plan (expecting @plan)
=> @plan
我想另一个答案是我如何创造性地使用 :find
和参数,即使我知道这不是最佳实践...
好吧,我有一个临时解决方案,就是使用select。即,
#run code
@current_plan = Plan.select { |p| p.stripe_subscription_id == event.data.object.lines.data.first.id }.first
#test code
@plan = Plan.new
Plan.stub_chain(:select, :first).and_return(@plan)
#result of @current_plan (expecting @plan)
=> @plan
不过...如果其他人有想法,请插话...我现在有点学术上好奇为什么 where
或 where, first
存根不起作用。
find_by_stripe_subscription_id
,我做了一些更多的测试,甚至在自定义 find_by
方法上,方法的预期也会失败,所以存根当然不会起作用。但是,请看下面 Zetetic 的回答,也许只有我才是众神讨厌的......
您可以存根这些方法。所有这些测试都通过了:
require 'rails_helper'
RSpec.describe Foo, type: :model do
let(:foo) { double(name: "foo") }
it "works with find" do
expect(Foo).to receive(:find).and_return(foo)
expect(Foo.find(1)).to eq foo
end
it "works with find_by" do
expect(Foo).to receive(:find_by_name).and_return(foo)
expect(Foo.find_by_name("foo")).to eq foo
end
it "works with where" do
expect(Foo).to receive(:where).and_return([ foo ])
expect(Foo.where(name: "foo")).to eq [foo]
end
end