6

假设我有一个公司,它可能包含许多员工类型的员工,可能包含许多任务类型的任务。

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

我做对了吗?

谢谢。

4

2 回答 2

8

如果你不想在数据库中创建任何东西,你可以这样做:

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

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

于 2013-08-14T13:52:19.897 回答
5

mock_model和之间有明显的区别stub_model

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

简而言之,主要区别在于这mock_model是一个真正的测试替身,就像一个 AR 模型。stub_model将创建一个实际AR 模型的实例。

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

于 2013-08-14T16:06:28.443 回答