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)
我做得对吗?
谢谢.
如果您不想在数据库中创建任何内容,可以执行以下操作:
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 Model和Stub Model。
简单地说,虽然,主要的区别是,mock_model是双真正的测试中,该行为像一个AR模型。stub_model将创建一个实际AR 模型的实例。
这些选项中的任何一个以及 Eric C 的代码片段都是将测试与数据库隔离的好方法。
| 归档时间: |
|
| 查看次数: |
2803 次 |
| 最近记录: |