Rspec 的未定义方法“+”。这是什么意思?

Dan*_*bio 5 ruby rspec ruby-on-rails

我碰壁了,因为我对这个 rspec 错误消息的含义感到非常困惑。我正在测试一件艺术品是否有成本。以下是我的 rspec 片段:

let(:valid_art_piece){ { date_of_creation: DateTime.parse('2012-3-13'), 
placement_date_of_sale: DateTime.parse('2014-8-13'), cost: 250, medium: 'sculpture', 
availability: true } }

it 'requires a cost' do
  art_piece = ArtPiece.new(valid_art_piece.merge(cost: ''))
  expect(art_piece).to_not be_valid
  expect(art_piece.errors[:cost].to include "can't be blank")
end
Run Code Online (Sandbox Code Playgroud)

错误信息:

1) ArtPiece requires a cost
 Failure/Error: expect(art_piece.errors[:cost].to include "can't be blank")
 NoMethodError:
   undefined method `+' for #<RSpec::Matchers::BuiltIn::Include:0x000001050f4cd0>
 # ./spec/models/artist_piece_spec.rb:30:in `block (2 levels) in <top (required)>'
Run Code Online (Sandbox Code Playgroud)

就我而言,这不应该失败,我不知道为什么会失败。我的 schema.rb 将该字段设为 null false,我的模型使用 numericity: true 选项对其进行验证。

class ArtPiece < ActiveRecord::Base
  validates_presence_of :date_of_creation
  validates_presence_of :placement_date_of_sale
  validates :cost, numericality: true
  validates_presence_of :medium
  validates_presence_of :availability
end
Run Code Online (Sandbox Code Playgroud)

我不知道是什么问题。一些帮助?

swi*_*osz 5

这是一个语法错误。你之前.to和之前错过了括号"can't be blank"

这一行应该是这样的:

expect(art_piece.errors[:cost] ) .to include ( "不能为空")

无论如何,我建议include使用 match_array替换方法

it 'requires a cost' do
  art_piece = ArtPiece.new(valid_art_piece.merge(cost: ''))
  expect(art_piece).to_not be_valid
  expect(art_piece.errors[:cost]).to match_array (["can't be blank"])
end
Run Code Online (Sandbox Code Playgroud)

PS:每个测试只实现一个期望是一个很好的约定。

最后一个例子应该是这样的:

context "art_piece" do
  subject { ArtPiece.new(valid_art_piece.merge(cost: '')) }

  it 'should_not be valid' do
     expect(subject).to_not be_valid
  end

  it 'requires a cost' do
    expect(subject.errors[:cost]).to match_array (["can't be blank"])
  end
end
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助:)