ruby-on-rails - Association.first 在使用具有 has_many 关联的 FactoryGirl 工厂的 RSpec 功能规范中返回 nil

标签 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(: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_list.items 是一个 ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Item 对象,因此 first 似乎应该返回第一个 Item 记录?我得到的是 niltodo_list.items.count 返回 3 并且 test.log 显示正确创建的所有记录。我错过了什么?

最佳答案

在访问第一项之前尝试重新加载关联:

todo_list.items.reload

我认为需要reload,因为todo_list对象在创建时没有任何项目,并且我怀疑RSpec缓存了它。 items 在创建 todo_list 对象后创建。

关于ruby-on-rails - Association.first 在使用具有 has_many 关联的 FactoryGirl 工厂的 RSpec 功能规范中返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520675/

相关文章:

ruby-on-rails - 将 Rails 路由助手作为类方法添加到类中

javascript - 为什么 jQuery 轮播不能与 iframe 一起使用?

ruby - 沉默工厂女孩伐木

ruby - RSpec 与 Shoulda?

ruby-on-rails - 测试返回 HTML 的 Rails 辅助方法,与纯文本进行比较

ruby-on-rails - 如何检索刚刚使用嵌套方法创建的帐户 ID?

ruby-on-rails - 无方法错误 : undefined method `getlocal' for DateTime object

ruby-on-rails - FactoryGirl协会与引用

ruby-on-rails - rails : create through-record via association

ruby-on-rails - Rails 3 中按多列对行进行高效排序