我在rspec和rspec-rails 2.11.0中遇到了一些令人困惑的行为。我已经在同事的应用程序上运行了2.7.1(两者都在ruby 1.9.3上)
这些测试按预期工作(失败):
it "should not change i" do
i = 0
expect {
i = 2
}.not_to change { i }
end
it "should not change i" do
i = 0
expect {
i = 2
}.not_to change { i }.from( 0 )
end
失败消息是“结果不应该改变,但在两种情况下确实从0变为2”
将期望中的“from”更改为一个不同的值莫名其妙地使它通过,而不是失败,无论期望块中i的值发生什么变化:
it "should not change i" do
i = 0
expect {
i = 2
}.not_to change { i }.from( 1 )
end
我最近才升级到1.9.3,我可以肯定地说,如果我遇到它,我会注意到这种行为。谁能解释这个和/或我做错了什么?
答案 0 :(得分:8)
我认为它并不像你期望的那样,但是编写测试的方式并没有真正暴露出来。您的上一个值失败,因为它从未被定义为1。
揭示这一点的主要步骤是反转测试。
describe "stuff" do
it "should not change i" do
i = 0
expect {
i = 2
}.to change { i }
end
it "should not change i" do
i = 0
expect {
i = 2
}.to change { i }.from( 0 )
end
it "should not change i" do
i = 0
expect {
i = 2
}.to change { i }.from( 1 )
end
end
这导致前两个测试通过,最后一个测试失败,错误为result should have initially been 1, but was 0
因此,如果我们按原样进行问题测试,你说的是i should not change from 1
,因为我从不是1,所以这个测试永远不会失败。
it "should not change i" do
i = 0
expect {
i = 2
}.not_to change { i }.from( 1 ) # i goes from 0 to 2, not 1 to 2, so the test is valid
end