4

我最近将我的 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等等。到目前为止没有任何效果。

谢谢你的帮助。

4

1 回答 1

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 中会导致警告。

于 2014-06-17T14:07:04.850 回答