【发布时间】:2018-01-10 02:45:08
【问题描述】:
我正在使用 FactoryBot(以前的 FactoryGirl)为我的测试创建一些工厂数据。我有一个通过模式看起来像这样的模型(只剩下相关的东西):
create_table "items", force: :cascade do |t|
t.text "team"
t.text "feature_id"
t.text "feature"
t.timestamps
end
但是,feature_id 和 feature 不是对功能对象的引用...它们只是字符串。
我这样定义我的工厂:
FactoryBot.define do
factory :item do
team "TheTeam"
sequence(:feature_id) {|n| "Feature#{n}" }
feature { Faker::Lorem.sentence }
end
end
简单的案例有效:
> FactoryBot.create(:item)
=> #<Item:0x007fad8cbfc048
id: 1,
team: "TheTeam",
feature_id: "Feature1",
feature: "Qui voluptatem animi et rerum et.",
created_at: Wed, 10 Jan 2018 02:40:01 UTC +00:00,
updated_at: Wed, 10 Jan 2018 02:40:01 UTC +00:00>
但是当我想指定自己的 feature_id 时,会发生这种情况:
> FactoryBot.create(:item, feature_id: "123")
=> #<Item:0x007fad8d30a880
id: 2,
team: "TheTeam",
feature_id: "123",
feature: nil,
created_at: Wed, 10 Jan 2018 02:40:59 UTC +00:00,
updated_at: Wed, 10 Jan 2018 02:40:59 UTC +00:00>
您可以看到feature 现在是nil。我假设这是因为它试图推断 feature_id 和 feature 在某种程度上是相关的。但在这种情况下,我不希望他们成为。
有没有更好的方法来定义工厂,以便将它们视为不相关的字段?
顺便说一句,如果我尝试同时设置 feature_id 和 feature 它看起来像这样:
> FactoryBot.create(:item, feature_id: "123", feature: "hi")
=> #<Item:0x007fad8d262810
id: 3,
team: "TheTeam",
feature_id: nil,
feature: nil,
created_at: Wed, 10 Jan 2018 02:45:01 UTC +00:00,
updated_at: Wed, 10 Jan 2018 02:45:01 UTC +00:00>
所以它只是将两个字段都设置为nil。我怀疑 FactoryBot 正试图根据它们的名称对这些字段“聪明”。我会更改它们,但它们已经在 Db 中设置。
【问题讨论】:
-
如果您在 FactoryBot 之外创建记录,此模型是否按预期工作?例如,如果你做
Item.create(team: 'TheTeam', feature_id: '123', feature: 'Description of feature'),你会得到一个保存所有属性的记录吗? -
好问题,@moveson。是的,它通过控制台工作,只是做你在那里做的事情。我没有对字段进行任何验证,也没有任何关系(此时)。 Item 类不引用任何其他内容。所以 Rails 本身就很好。它似乎只是 FactoryBot 中的东西
标签: ruby-on-rails ruby rspec factory-bot factory