Rails FactoryBot / Rspec不使用let创建

时间:2018-08-14 18:49:00

标签: ruby-on-rails rspec factory-bot

所以这是我第一次编写单元测试,而Im集成了Rspec w / FactoryBot。

我的规格使用@实例变量工作得很好,但是当我使用let!时,第二个模型失败,因为从未创建过第一个模型。

规格:

require "rails_helper"

RSpec.describe Note, :type => :model do

  before(:all) do
    let!(:event){ FactoryBot.create(:event) }
    let!(:note){ FactoryBot.create(:note) }
  end

  it "is valid with valid attributes" do
    expect(note).to be_valid
  end

end

工厂:

FactoryBot.define do
  factory :note do
    event_id Event.first.id
    content "This is a sample note"
  end
end


FactoryBot.define do
  factory :event do
    title "Event Factory Test"
    event_date Date.today
    event_time "1:30 PM"
  end
end

如您所见,注释需要一个事件ID(需要创建事件),但是在尝试查找应该由Event.first.id创建的let!时会抱怨。

有什么想法吗?这种“似乎”类似于其他人在其他rspec测试中使用let的方式。

1 个答案:

答案 0 :(得分:1)

如果将它们包装在let块中,则

let!before不起作用。

require "rails_helper"
RSpec.describe Note, :type => :model do
  let!(:event){ FactoryBot.create(:event) }
  let!(:note){ FactoryBot.create(:note) }
  it "is valid with valid attributes" do
    expect(note).to be_valid
  end
end

要在工厂内建立关联,只需传递工厂名称即可:

FactoryBot.define do
  factory :note do
    event # short for association :event
    content "This is a sample note"
  end
end

(如果工厂名称与关联名称相同,则可以省去工厂名称。)。

尽管如此,您仍然在考虑工厂错误。他们应该是产生唯一可测试记录的工厂。没有一套固定装置。您定义工厂的方式只有在创建事件后才能起作用。千万不要硬连线工厂!

如果您想稍后再参加活动,请这样做:

require "rails_helper"
RSpec.describe Note, :type => :model do
  let!(:note){ FactoryBot.create(:note) }
  it "has an event" do
    expect(note.event).to be_a Event
  end
end