ruby-on-rails - 当返回的消息为 'expect to raise_error' 时,为什么此 rspec 'ActiveRecord::RecordInvalid' 失败

标签 ruby-on-rails rspec

以下 rspec 测试失败,但与失败测试一起提供的消息似乎是预期结果。

describe '#validate_maximum_pending_actions_not_been_reached' do
  let(:action) { build :action, status: 'pending' }
  before :each do
    10.times do
      create :action, status: 'pending'
    end
  end
  it 'does not save the 11th action' do
    expect(action.save).to raise_error #(ActiveRecord::RecordInvalid,'Validation failed: maximum number of pending actions already reached')
  end
end


Failure/Error: let(:action) { build :action, status: 'pending' }
  ActiveRecord::RecordInvalid:
    Validation failed: maximum number of pending actions already reached

我已经尝试通过省略错误消息来降低具体性,并且只是期望测试会raise_error。测试仍然失败,但上面的描述表明确实出现了错误。

我做错了什么?

正在测试的方法如下:

validate :validate_maximum_pending_actions_not_been_reached
def validate_maximum_pending_actions_not_been_reached
  errors[:base] << "maximum number of pending actions already reached" unless Action.where(status: 'pending').size <= 10
end

最佳答案

您的规范应该在这样的 block 中。此外,您还可以使用错误类指定错误

  it 'does not save the 11th action' do
    expect{ action.save! }.to raise_error(ActiveRecord::RecordInvalid) #(ActiveRecord::RecordInvalid,'Validation failed: maximum number of pending actions already reached')
  end

关于ruby-on-rails - 当返回的消息为 'expect to raise_error' 时,为什么此 rspec 'ActiveRecord::RecordInvalid' 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35455104/

相关文章:

ruby-on-rails-3 - 在 Rails 3 上使用 Rspec 和 MongoID 清除或重置测试数据库

ruby-on-rails - YouTube api的yt gem在Rails上使用ruby

ruby-on-rails - 如何使用 nokogiri 和 mechanize 从 &lt;script&gt; 标签中提取文本?

ruby-on-rails - Ruby:如何向对象添加方法? (或者简单地扩展对象类)

ruby-on-rails - 如何在rspec中的lambda之后测试不止一件事?

ruby-on-rails - 如何避免在 find 方法中出现 `hardcoding` id?

ruby-on-rails - SASS中每隔一行的背景色

javascript - 如何设置包含属于product_category 的选项的订单

ruby-on-rails - 安装发动机的 RSpec 测试路线

javascript - 自定义函数的 ruby​​execute_script 导致没有结果