3

听 Giant Robots Smashing Into Other Giant Robots 播客,我听说您希望 FactoryGirl 工厂最小化,只提供使对象在数据库中有效的那些属性。话虽如此,谈话还继续说,特征是一种非常好的方法,可以根据未来可能发生变化的属性来定义特定行为。

我想知道定义特征是否故意使验证失败以清理规范代码是否也是一个好主意。这是一个例子:

factory :winner do
  user_extension "7036"
  contest_rank 1
  contest

  trait :paid do
    paid true
  end 

  trait :unpaid do
    paid false
  end 

  trait :missing_user_extension do
    user_extension nil 
  end 

  trait :empty_user_extension do
    user_extension ""
  end 

end

将允许我build_stubbed(:winner, :missing_user_extension)在我打算通过验证的测试中调用我的规范。我想我可以通过将这些坏工厂嵌套在另一个名为 的工厂下来进一步明确失败:invalid_winner,但我不太确定这是否有必要。我最感兴趣的是听听其他人对这个概念的看法。

4

1 回答 1

5

不,这不是一个好主意,它不会让你的规范在一段时间后清楚地理解,然后当你的代码演变时,那些今天失败的工厂可能不再失败,你将很难审查你的所有规范。

最好为一件明确识别的事情编写测试。如果您想检查保存是否因缺少强制参数而失败,只需将其写入您的常规工厂并添加参数以覆盖工厂的值:

it 'should fail' do
  create :winner, user_extension: nil 
  ...
end
于 2013-08-01T03:43:32.180 回答