Stubbing ActiveRecord关联

时间:2013-08-14 13:36:18

标签: ruby-on-rails rspec mocking stubbing

假设我有一个可能包含许多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

我做得对吗?

感谢。

2 个答案:

答案 0 :(得分:7)

如果您不想在数据库中创建任何内容,可以执行以下操作:

employee = mock_model(Employee)
task = mock_model(Task, name: "Do that", employee: employee)

请注意,您无法像这样查询它们。它与构建对象大致相同。如果您想要执行任何需要查询实际数据的事情,例如集成测试,那么您需要使用create在数据库中创建内容。或者正如一位评论者指出的那样,您可以使用FactoryGirl的方法来存根。

答案 1 :(得分:4)

mock_modelstub_model之间存在明显差异。

假设您使用的是RSpec,请查看Mock ModelStub Model

简而言之,主要区别在于mock_model是真正的测试双重,行为就像AR模型一样。 stub_model将创建实际 AR模型的实例。

这些选项中的任何一个以及Eric C的代码片段都是将测试与数据库隔离的好方法。