使用时升级到rspec 3导致错误应该有(1).error_on

Mat*_*ieu 12 rspec ruby-on-rails rspec3

由于我更新了我的Gemfile并转移到rspec 3,在许多测试中,我收到错误:way:

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
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

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

我读过我现在应该使用"expect"而不是应该但是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
Run Code Online (Sandbox Code Playgroud)

Eer*_*ero 18

我已经取代了喜欢的

Deal.new(hash).should have(1).error_on(:details)
Run Code Online (Sandbox Code Playgroud)

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

valid?初始化errors列表时,第一个期望是必要的.


sev*_*cat 8

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

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

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

如果你这样做了,那么你的代码就会收到一个弃用错误,它也会告诉你如何修复它.

  • 只需添加你的Gemfile:gem"rspec-collection-matchers". (2认同)