所以这是我第一次编写单元测试,而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
的方式。
答案 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