假设我有一个可能包含许多Employee类型员工的公司,可能包含许多Task类型的任务。
class Company < ActiveRecord::Base; has_many :employees; end
class Employee < ActiveRecord::Base; belongs_to :company, has_many :tasks; end
class Task < ActiveRecord::Base; belongs_to :employee; end
使用像FactoryGirl这样的工具我可能会试图使用FactoryGirl.create(:task)
创建任务来强制创建员工和公司。
我想要做的是创建有效的ActiveRecord对象,但是它们之间的关系已被删除,以便让我的测试更快。
我提出的解决方案是不使用FactoryGirl并使用mock_model / stub_model创建新对象来存根它们的关联。
示例:
employee = mock_model(Employee)
task = Task.create! name: "Do that", employee: employee
我做得对吗?
感谢。
答案 0 :(得分:7)
如果您不想在数据库中创建任何内容,可以执行以下操作:
employee = mock_model(Employee)
task = mock_model(Task, name: "Do that", employee: employee)
请注意,您无法像这样查询它们。它与构建对象大致相同。如果您想要执行任何需要查询实际数据的事情,例如集成测试,那么您需要使用create
在数据库中创建内容。或者正如一位评论者指出的那样,您可以使用FactoryGirl的方法来存根。
答案 1 :(得分:4)
mock_model
和stub_model
之间存在明显差异。
假设您使用的是RSpec,请查看Mock Model和Stub Model。
简而言之,主要区别在于mock_model
是真正的测试双重,行为就像AR模型一样。 stub_model
将创建实际 AR模型的实例。
这些选项中的任何一个以及Eric C的代码片段都是将测试与数据库隔离的好方法。