12

由于我更新了我的 Gemfile 并移至 rspec 3,在许多测试中,我收到一个错误:方式:

it "should reject attribute that are too short" do
      short = "a" * 3
      hash = @attr.merge(:details => short)
      Deal.new(hash).should have(1).error_on(:details)
    end

我收到此错误:

Failure/Error: Deal.new(hash).should have(1).error_on(:details)
     NoMethodError:
       undefined method `have' for #<RSpec::ExampleGroups::Deal_2::TestsOnDealsModelsValidations>

我读到我现在应该使用“期望”而不是应该但是在这里have(1).error_on,我应该如何编写它以符合 rspec 3?

我尝试了以下方法,但仍然无法正常工作:

it "should reject attribute that are too short" do
      short = "a" * 3
      hash = @attr.merge(:details => short)
      expect(Deal.new(hash).error_on(:details).size).to eq(1)
    end
4

3 回答 3

18

我已经替换了

Deal.new(hash).should have(1).error_on(:details)

deal = Deal.new(hash)
expect(deal.valid?).to be_falsey
expect(deal.errors[:details].size).to eq(1)

第一个期望valid?是必要的,因为它初始化了errors列表。

于 2014-07-16T19:43:43.883 回答
8

have和其他类似的匹配器已从 rspec 核心移到另一个 gem 中,即 rspec-collection-matchers

我建议遵循 rspec 2 -> 3 的升级路径,详见 rspec 文档:https ://relishapp.com/rspec/docs/upgrade

  • 升级到 rspec 2.99
  • 运行你的测试套件
  • 修复弃用警告
  • 升级到 rspec 3。

如果您这样做了,您的代码会收到一个弃用错误,该错误还会告诉您如何修复它。

于 2014-06-07T10:50:47.867 回答
1

添加到您的行Gemfile应该是:

gem 'rspec-collection_matchers'
于 2015-10-15T16:12:29.787 回答