【问题标题】:Stubbing ActiveRecord associations存根 ActiveRecord 关联
【发布时间】:2013-08-16 11:55:46
【问题描述】:

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

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

我做得对吗?

谢谢。

【问题讨论】:

  • 使用 FactoryGirl.build_stub
  • FactoryGirl.build_stubbed(不是 build_stub)的工作原理非常棒,谢谢!

标签: ruby-on-rails rspec mocking stubbing


【解决方案1】:

如果您不想在数据库中创建任何内容,可以这样做:

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

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

【讨论】:

    【解决方案2】:

    mock_modelstub_model 之间存在明显区别。

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多