【问题标题】:How to test if database record is created如何测试是否创建了数据库记录
【发布时间】:2014-01-26 22:28:58
【问题描述】:

假设我有一些简单的 ActiveRecord 模型:

class Order < ActiveRecord::Base
  def self.for_bucket(bucket)
    create! bucket_id: bucket.id
  end
end

目前的测试是:

it 'creates new persistent object' do
    obj = subject.find_for_bucket(bucket)
    expect{ subject.find_for_bucket bucket }.to change{ described_class.count }.by(1)
  end

作为聪明的开发人员,我想通过将 NullDB 引入项目来删除数据库调用。 如何在不接触数据库的情况下测试方法Order.for_bucket

【问题讨论】:

  • 在单元测试中绝对不碰数据库是可取的。

标签: ruby-on-rails ruby unit-testing rspec


【解决方案1】:

如果您想避免撞到数据库,恐怕您无法期望described_class.count 的实际增加。但是您可以模拟.create! 方法,这可以说已经足够好了。实际上,在调用 .create! 之后创建对象是您可能不需要测试的,因为它已经由您选择的 ORM(无论是否 ActiveRecord)进行测试。

it 'creates new persistent object' do
  expect(subject).to receive(:create!).with({ :bucket_id => bucket.id })
  subject.for_bucket(bucket)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多