Stubbing ActiveRecord关联

Nic*_*nil 4 rspec ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

使用像FactoryGirl这样的工具我可能会试图通过FactoryGirl.create(:task)强制创建员工和公司来创建任务.

我想要做的是创建有效的ActiveRecord对象,但他们的关系被删除,以便让我的测试更快.

我提出的解决方案是不使用FactoryGirl并使用mock_model/stub_model创建新对象来存根它们的关联.

例:

employee = mock_model(Employee)
task = Task.create! name: "Do that", employee: employee
Run Code Online (Sandbox Code Playgroud)

我做得对吗?

谢谢.

Eri*_*c C 7

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

employee = mock_model(Employee)
task = mock_model(Task, name: "Do that", employee: employee)
Run Code Online (Sandbox Code Playgroud)

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


小智 5

mock_model和之间有明显的区别stub_model

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

简单地说,虽然,主要的区别是,mock_model是双真正的测试中,该行为像一个AR模型。stub_model将创建一个实际AR 模型的实例。

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