Rspec不能在哪里或者find_by_,只能查找

时间:2015-06-19 17:50:21

标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails stub

我要分享几对运行代码和测试代码。基本上,测试代码仅在我在对象类上使用find时才起作用,但问题是find是我不想使用的一种方法因为我是不找主键!

方法1 :使用:where存档Plan.all,以便可以首先调用

#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用于论证,尽管我知道这不是最佳做法......

2 个答案:

答案 0 :(得分:1)

您可以存根这些方法。所有这些测试都通过了:

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

答案 1 :(得分:0)

好的我有一个临时解决方案,只是使用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

尽管如此......如果其他人有想法,请加入...我现在对学术上有点好奇,为什么wherewhere, first存根不起作用。

find_by_stripe_subscription_id,我已经做了一些测试,甚至方法的期望也失败了自定义find_by方法,所以当然存根不起作用。但是,请参阅下面的zetetic的答案,也许这只是我讨厌的神......