编写无效的FactoryGirl工厂/特征是一个坏主意吗?

时间:2013-08-01 02:49:25

标签: ruby-on-rails unit-testing factory-bot rspec2 traits

听巨型机器人粉碎其他巨型机器人播客,我听说你希望你的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的工厂下来进一步明确失败,但我不太确定是否有必要。我最感兴趣的是听取别人对这个概念的看法。

1 个答案:

答案 0 :(得分:5)

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

为一个明确标识的东西编写测试更好。如果要检查保存是否因缺少必需参数而失败,只需使用常规工厂写入并添加参数以覆盖工厂中的值:

it 'should fail' do
  create :winner, user_extension: nil 
  ...
end