Ruby on rails association.first在RSpec功能规范中使用具有多个关联的FactoryGirl工厂返回nil
我在Rails 4应用程序中有以下内容:Ruby on rails association.first在RSpec功能规范中使用具有多个关联的FactoryGirl工厂返回nil,ruby-on-rails,rspec,associations,factory-bot,Ruby On Rails,Rspec,Associations,Factory Bot,我在Rails 4应用程序中有以下内容: FactoryGirl.define do factory :todo_list do after(:create) do |t| create_list(:item, 3, todo_list: t) end factory :public_todo_list do is_public true end end factory :item do sequence(:posi
FactoryGirl.define do
factory :todo_list do
after(:create) do |t|
create_list(:item, 3, todo_list: t)
end
factory :public_todo_list do
is_public true
end
end
factory :item do
sequence(:position) { |n| n }
name "This is item ##{:position}?"
todo_list
end
end
我在功能规范中有以下内容:
feature "TodoLists" do
let(:todo_list) { create(:public_todo_list) }
scenario "Something that requires accessing the first item" do
...
pending todo_list.items.first.name
...
end
end
但是,由于以下原因,测试失败:
Failure/Error: pending todo_list.items.first.name
NoMethodError:
undefined method `name' for nil:NilClass
由于
todo\u list.items
是一个ActiveRecord::Associations::CollectionProxy::ActiveRecord\u Associations\u CollectionProxy\u Item
对象,似乎first
应该返回第一个Item
记录?我得到的是nil
todo_list.items.count
返回3
和test.log
显示正确创建的所有记录。我遗漏了什么?我已经很长时间没有使用子工厂语法了,但是它们是否继承了父工厂的回调?试着用一种特质来代替,这似乎对你正在做的事情更有意义
FactoryGirl.define do
factory :todo_list do
after(:create) do |t|
create_list(:item, 3, todo_list: t)
end
trait :public do
is_public true
end
end
factory :item do
sequence(:position) { |n| n }
name "This is item ##{:position}?"
todo_list
end
end
然后:
feature "TodoLists" do
let(:todo_list) { create(:todo_list, :public) }
scenario "Something that requires accessing the first item" do
...
pending todo_list.items.first.name
...
end
end
在访问第一个项目之前,请尝试重新加载关联:
todo_list.items.reload
我认为需要
重新加载
,因为待办事项列表
对象在创建时没有任何项,我怀疑RSpec会缓存该项。项目
是在创建待办事项列表
对象之后创建的。为什么待决
待办事项列表.items.first.name?@KirtiThorat,当我试图检查一些输出时,我刚刚将其更改为待决
。您可以忽略挂起的
。在别处调用时,仍然会得到nil:NilClass的未定义方法“name”错误。您是否正在调用待办事项列表行前面的待办事项列表.items.first.name
?@backpackerh,我不是。你问这个问题是因为我在使用let
?我用todo\u list=create(:public\u todo\u list)
尝试了它,然后尝试在此行之前调用todo\u list
,但仍然得到nil
值。您是否尝试重新加载todo\u列表。项
?仍然得到相同的错误:(尽管如此,谢谢你提到特质。在这种情况下,这些特质更好。谢谢,这很有道理。