我在使用Factory Girl和Rspec测试Rails中的ActiveRecord包含验证时遇到了麻烦。包含验证总是失败。这是我的代码:
class FruitType
has_many :fruits
end
class Fruit
belongs_to :fruit_type
validates :fruit_type_id, numericality: { only_integer: true }
validates :fruit_type_id, inclusion: { in: FruitType.pluck(:id), message: "is invalid" }
end
FactoryGirl.define do
factory :fruit_type_apple, class: FruitType do
name "Apple"
end
end
FactoryGirl.define do
factory :valid_fruit, class: Fruit do
name "Red Apple"
association :fruit_type, factory: :fruit_type_apple
end
end
Rspec测试是:
it "should have valid factory" do
f = FactoryGirl.build( :valid_fruit )
puts f.fruit_type_id
puts "\n#{FruitType.all.pluck(:id)}"
expect(f).to be_valid
end
结果是:
1
[1] ˚F..........
故障:
1)验证时的水果应该有有效的工厂 失败/错误:期望(f)。be_valid 期望#有效,但收到错误:水果类型无效
正如您所看到的,我在测试中打印出了Fruit Type id列表,其中仅包含1.我已经打印出fruit_type_id的值,该值为1.然而,包含验证仍然失败。
如果我只是通过手动创建水果和类型在rails控制台中执行相同的操作,验证工作正常,就在我运行测试时,我看到了这种行为。有任何想法吗?我一定在这里错过了一些关于工厂女孩的事情。
答案 0 :(得分:3)
您不应该验证fruit_type_id
属性,而应使用在线验证
validates :fruit_type, presence: true