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 のアップグレード前と同じようにパスします。

ただし、2 番目のテストではエラーがスローされます。

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

構文を何に変更する必要がありますか?

not_toなどのいくつかのことをすでに試しましたbe_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 に答える