如何构建我的测试以适应数千种排列?

时间:2013-11-05 16:23:21

标签: ruby-on-rails unit-testing ruby-on-rails-4

我的Rails 4网站中有一些模型,我正在进行单元测试。通过Clazz模型,Student可以有多个Enrollment s。

为了正确地进行单元测试Clazz,我需要创建数千种类型和数量的类,注册和学生的不同排列。在这方面使用.yml将非常麻烦,所以我认为我需要创建一个工厂帮助方法。我知道有些人在为测试创建新逻辑时会犯规,但我没有看到解决方法。

在我的工厂方法中,我使用.new(即Clazz.new())创建了对象,因为我打算仅在每个测试中使用模型。但是,由于模型是使用.new创建的,因此模型中的ActiveRelation代码无法正常运行。例如

class Clazz
    def cash_enrollments
        enrollments.where(payment_type: 'cash')
    end
end

这个cash_enrollments方法在我的测试中返回零记录,因为我的对象不在数据库中。

我应该如何处理这些测试?

如果我使用.create,那么我应该删除该测试中使用的所有模型,以便将数据集保持在已知状态,对吗?这似乎很乏味且容易出错。

如果我不使用.create,那么如何构建这些对象,以便我不需要通过添加一堆.to_a调用来重写我的模型代码,这肯定会导致降级在表现?

1 个答案:

答案 0 :(得分:1)

如果您需要许多不同的物体组合,我建议您查看FactoryGirl。如果需要,您可以定义几个基本对象并针对每个测试进行调整。说,你有一个用户工厂

factory :user do
  sequence(:name) {|x| "user #{x}"}
  balance { 0 }
  email_confirmed { true }
end

您可以无钱地创建此基本确认用户:

u = FactoryGirl.create(:user)

或者你可以让他变得富有,只有这一个例子:

wealthy_user = FactoryGirl.create(:user, balance: 1_000_000)

或者您可以取消设置“已确认”标志。或者做其他事情。你明白了。