我的测试应该为manditory association创建db记录吗?

时间:2016-10-31 11:07:09

标签: mysql ruby-on-rails performance unit-testing mocking

这是一个最佳实践问题:如果我的Garden的必填字段为user_id,我的测试应该是在数据库中实际创建User,还是有更好的方法?

我发现在我的控制器的更新测试中,我遇到了我想要重复使用我的花园工厂的情况,但是花园工厂在数据库中创建了所需的用户并且我&# 39; m在重复的电子邮件中遇到唯一约束违规。所以现在我要么让工厂生成独特的电子邮件,要么我需要学习如何模拟相关的记录。

我想真正让我感到困惑的是,创建/更新花园会检查数据库是否存在相关记录。我还不明白我如何能够做到这一点。而且我也不知道这是否有必要?如果我将database_cleaner gem设置为默认执行测试作为数据库事务,也许我不必担心有多少User条记录正在编写"?

1 个答案:

答案 0 :(得分:0)

我会使用factory girl这是模仿模型及其关联行为的好方法。创建具有关联的工厂有几种不同的方法。您可以创建始终创建其关联的工厂。我个人更喜欢单独创建我的工厂的所有实例,因为它给了我更大的灵活性,这并不是说没有好的用例去做。

#garden factory
FactoryGirl.define do
    factory :garden do
      #you can choose which attributes to prepopulate for every garden
    end
  end

#garden factory
FactoryGirl.define do
    factory :user do
      #you can choose which attributes to prepopulate for every garden
    end
  end

#in your test
user1 = FactoryGirl.create(:user, name: 'user1', role: 'farmer)
garden1 = FactoryGirl.create(:garden, name: 'garden1', flower_count: 6, user: user1)

现在你变得更加复杂,但这是一个简单的例子,你可以here获得更多指针