【问题标题】:Stubing record creation in Rspec在 Rspec 中创建存根记录
【发布时间】:2014-01-11 19:24:24
【问题描述】:

我有一个构建器类,它应该创建新记录,比方说:

ObjectBuilder creates Object

Object 它是一个ActiveRecord::Base 继承类。

如果创建了特定记录,我想在Rspec 中进行测试。

但仅测试是否会创建特定记录就足够了,without database call。那么我如何存根 AR 对象来检查呢?

响应潜在答案我无法将NullDB 集成到我的项目中,并且我不会在Object 中创建自定义方法,该方法将负责创建记录,并且很容易存根。我想依赖ActiveRecord接口。

【问题讨论】:

  • 我没有尝试任何具体的东西。我拒绝了两种提到的方法。这似乎是一种普遍的需求,所以我认为有人已经遇到过。
  • 没有共同的需求,因为:1. 您不使用构建器模式在 Rails 中创建对象 2. 您只需在模型类上存根 create
  • 另一件事:你的例子太抽象了,很难给出任何建议。请使用有效的示例代码更新您的问题

标签: ruby-on-rails ruby activerecord rspec rspec-rails


【解决方案1】:

我认为您需要准确地决定要在这里测试什么。如果您正在测试 ActiveRecord 是否有效,那么您就走错了路。 ActiveRecord 本身经过全面测试,您在应用程序中添加的任何进一步测试都有些多余。

在这里查看 ActiveRecord 测试、它们的工作原理、涵盖的内容等: https://github.com/rails/rails/tree/master/activerecord/test

我认为您可能想要测试的是,当您在应用程序中调用 @object.save 时,您的对象是否能够被保存。如果是这种情况,那么您可以通过调用#valid? 方法轻松地测试它而无需真正保存对象。如果对象无效,ActiveRecord 将不会保存它。

这样就足够了:

require 'spec_helper'

describe Object do
  before(:each) do
    object = Object.new(attr1: 'required')
  end

  it "is valid with required attributes" do        
    expect(object).to be_valid
  end

  it "is not valid without an attr1" do
    object.attr1 = nil
    expect(object).not_to be_valid
  end
end

您可以通过将rspec-collection_matchers gem 添加到您的项目并执行以下操作来更全面地测试验证:

it "is not valid without an attr1" do
  object.attr1 = nil
  expect(object).to have(1).errors_on(:attr1)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多