Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails association.first在RSpec功能规范中使用具有多个关联的FactoryGirl工厂返回nil_Ruby On Rails_Rspec_Associations_Factory Bot - Fatal编程技术网

Ruby on rails association.first在RSpec功能规范中使用具有多个关联的FactoryGirl工厂返回nil

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

我在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(: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列表。项
?仍然得到相同的错误:(尽管如此,谢谢你提到特质。在这种情况下,这些特质更好。谢谢,这很有道理。