Ruby on rails FactoryBot:未注册的特征:";待办事项;

Ruby on rails FactoryBot:未注册的特征:";待办事项;,ruby-on-rails,factory-bot,Ruby On Rails,Factory Bot,为了帮助测试,我一直在通过一个引入了工厂机器人的程序进行工作。本教程在其他方面都很不错,但我还无法解决修复此错误的方法: Failure/Error: let!(:items) { create_list(:item, 20, todo_id: todo.id) } KeyError: Trait not registered: "todo_id" 项目规格rb RSpec.describe 'Items API' do # Initialize the te

为了帮助测试,我一直在通过一个引入了工厂机器人的程序进行工作。本教程在其他方面都很不错,但我还无法解决修复此错误的方法:

Failure/Error: let!(:items) { create_list(:item, 20, todo_id: todo.id) }

      KeyError:
        Trait not registered: "todo_id"
项目规格rb

RSpec.describe 'Items API' do
  # Initialize the test data
  let!(:todo) { create(:todo) }
  let!(:items) { create_list(:item, 20, todo_id: todo.id) }
  let(:todo_id) { todo.id }
  let(:id) { items.first.id }
...
FB items.rb

FactoryBot.define do
  factory :item do
    name { Faker::StarWars.character }
    done { false }
    todo_id nil
  end
end
FB todos.rb

FactoryBot.define do
  factory :todo do
    title { Faker::Lorem.word }
    created_by { Faker::Number.number(digits: 10) }
  end
end
routes.rb

Rails.application.routes.draw do
  resources :todos do
    resources :items
  end
end
迁移

待办事项有很多项目

class CreateTodos < ActiveRecord::Migration[6.0]
  def change
    create_table :todos do |t|
      t.string :title
      t.string :created_by

      t.timestamps
    end
  end
end
class CreateTodos
class CreateItems

我想这是一个相对简单的解决方案,但我对工厂机器人还不熟悉,我对一些可能的解决方案犹豫不决,因为它们改变了很多东西。如果有人有解决方案,我很想知道,否则我将继续努力挖掘factorybot文档,这并不是最糟糕的事情。

我想问题来自这里:

items.rb

FactoryBot.define do
  factory :item do
    name { Faker::Starwars.character }
    done { false }
    todo_id nil
  end
end
我把它改成:

FactoryBot.define do
  factory :item do
    name { Faker::Lorem.character }
    done { false }
    todo_id { 1 }
  end
end
这是洛雷姆而不是星球大战,因为我犯了这个错误:
未初始化常量伪造者::星战


我给了
todo\u id
一个值1,这感觉不对。但在我找到更好的解决方案之前。。。它正在通过测试。

我认为问题来自这里:

items.rb

FactoryBot.define do
  factory :item do
    name { Faker::Starwars.character }
    done { false }
    todo_id nil
  end
end
我把它改成:

FactoryBot.define do
  factory :item do
    name { Faker::Lorem.character }
    done { false }
    todo_id { 1 }
  end
end
这是洛雷姆而不是星球大战,因为我犯了这个错误:
未初始化常量伪造者::星战

我给了
todo\u id
一个值1,这感觉不对。但在我找到更好的解决方案之前。。。它正在通过测试

在工厂内建立协会是可能的。如果工厂 名称与关联名称相同,工厂名称可以保留 退出。
-

在工厂内建立协会是可能的。如果工厂 名称与关联名称相同,工厂名称可以保留 退出。
-


由于todo_id是在项目和todo之间创建关系的外键,因此您不应该手动分配它,因为在运行测试套件时,您不知道该todo的id是什么-当然,您可以在每次运行测试或通过种子时重置DB,但这不包括100%的情况

您可以使用FactoryBot提供的

由于可以从模型中推断关联,因此可以执行以下操作:

FactoryBot.define do
  factory :item do
    todo
    name { Faker::Lorem.character }
    done { false }
  end
end

由于todo_id是在项目和todo之间创建关系的外键,因此您不应该手动分配它,因为在运行测试套件时,您不知道该todo的id是什么-当然,您可以在每次运行测试或通过种子时重置DB,但这不包括100%的情况

您可以使用FactoryBot提供的

由于可以从模型中推断关联,因此可以执行以下操作:

FactoryBot.define do
  factory :item do
    todo
    name { Faker::Lorem.character }
    done { false }
  end
end

TODO的迁移情况如何?@SebastianPalma添加了TODO和ItemsHow的迁移情况如何?@SebastianPalma添加了TODO和Items的迁移情况谢谢!这就是为什么我觉得这真的是错的。。协会应该处理它,但是,直到你的帖子(和max的帖子)之前,我真的不知道如何在fb环境中设置它。谢谢!这就是为什么我觉得这真的是错的。。协会应该处理它,但是,直到你的帖子(和max的帖子)我才真正确定如何在fb环境中设置它。