在Rspec中创建记录

时间:2014-01-11 19:24:25

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

我有一个构建器类,应该创建新记录,让我们说:

ObjectBuilder creates Object

Object这是ActiveRecord::Base继承的类。

我想在Rspec中测试是否创建了特定记录。

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

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

1 个答案:

答案 0 :(得分:2)

我认为您需要确定您要在此测试的确切内容。如果您正在测试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