我最近将我的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_to
,be_falsey
等。到目前为止,没有任何工作。
感谢您的帮助。
答案 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中引起警告。