使用FactoryGirl包含在验证和Rspec中

时间:2014-07-19 19:32:48

标签: ruby-on-rails rspec factory-bot

我在使用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控制台中执行相同的操作,验证工作正常,就在我运行测试时,我看到了这种行为。有任何想法吗?我一定在这里错过了一些关于工厂女孩的事情。

1 个答案:

答案 0 :(得分:3)

您不应该验证fruit_type_id属性,而应使用在线验证

validates :fruit_type, presence: true