我的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
调用来重写我的模型代码,这肯定会导致降级在表现?
答案 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)
或者您可以取消设置“已确认”标志。或者做其他事情。你明白了。