如何修复版本2.99的RSpec语法?

时间:2014-06-17 13:47:24

标签: ruby-on-rails ruby rspec rspec-rails rspec3

我最近将我的Rails 4应用程序从RSpec 2.X升级到2.99,尽管已经运行Transpec,但我的一些测试仍然失败。

require 'spec_helper'

describe Invoice, :type => :model do

  before :each do
    @user = FactoryGirl.create(:user)
    @invoice = FactoryGirl.create(:invoice, :user => @user)
  end

  it "is not open" do
    expect {
      FactoryGirl.create(:payment, :invoice => @invoice, :amount => 100)  
    }.to change{@invoice.reload.open?}.from(true).to(false)
  end

  it "is open" do
    expect {
      FactoryGirl.create(:payment, :invoice => @invoice, :amount => 99.99)  
    }.to_not change{@invoice.reload.open?}.to(false)
  end

end

第一次测试就像RSpec升级之前一样。

然而,第二次测试会引发错误:

Failure/Error: expect {
   `expect { }.not_to change { }.to()` is deprecated.

我必须将语法更改为什么?

我已经尝试了一些事情,例如not_tobe_falsey等。到目前为止,没有任何工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:9)

不要声明该值不会改变为某些东西,只是断言它不会改变:

it "is open" do
  expect {
    FactoryGirl.create(:payment, :invoice => @invoice, :amount => 99.99)  
  }.to_not change { @invoice.reload.open? }
end

这不会测试@invoice.reload.open?的初始值,但无论如何你应该对它进行单独的测试。在此测试中,您无需再次测试它。

尽管如此,在RSpec 3中,您可以单独使用.from来测试未更改的值是否具有给定的初始值:

it "is open" do
  expect {
    FactoryGirl.create(:payment, :invoice => @invoice, :amount => 99.99)  
  }.to_not change { @invoice.reload.open? }.from(false)
end

在RSpec 2中你不能这样做;如果传递给.to_not change {}.from的值不符合预期,则会.from通过。在RSpec 2.99中引起警告。