0

我在我的 Rails 4 站点中有几个模型,我正在对它们进行单元测试。A可以通过模型Clazz有很多Students 。Enrollment

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

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

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

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

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

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

如果我不使用.create,那么如何构建这些对象,这样我就不需要通过添加一堆.to_a肯定会导致性能下降的调用来重写我的模型代码?

4

1 回答 1

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)

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

于 2013-11-07T21:09:29.320 回答