我正在使用 Rspec 为我的程序进行一些测试。在规范中,我将类实例化一次,然后使用describe和contexts对其进行测试。我遇到了一些有趣的事情,如果它似乎在上下文结束时被评估。例如,给定以下类及其相关规范:
class Tmp
def initialize
@values = {}
end
def modify(new_value1, new_value2)
@values = {:a => new_value1, :b => new_value2}
end
def get_values
return @values
end
end
describe Tmp do
tmp = Tmp.new()
describe "testing something" do
context "change value" do
# First evaluation
tmp.modify("hi", "bye")
it {tmp.get_values.should == {:a => "hi", :b => "bye"}}
# Second evaluation
tmp.modify("bye", "hi")
it {tmp.get_values.should == {:a => "bye", :b => "hi"}}
end
end
end
使用提供的类和规范,结果如下:
F.
Failures:
1) Tmp testing something change value
Failure/Error: it {tmp.get_values.should == {:a => "hi", :b => "bye"}}
expected: {:a=>"hi", :b=>"bye"}
got: {:a=>"bye", :b=>"hi"} (using ==)
Diff:
@@ -1,3 +1,3 @@
-:a => "hi",
-:b => "bye"
+:a => "bye",
+:b => "hi"
# ./spec/tmp_spec.rb:11:in `block (4 levels) in <top (required)>'
Finished in 0.00211 seconds
2 examples, 1 failure
这很有趣,因为 Rspec 似乎使用tmp中的值评估第一个它,因为它位于上下文的末尾。即使在上下文中tmp正在更改其值并且应该通过,Rspec 仍会根据变量在结尾处具有的最后一个值来评估其(我什至在上下文中使用本地原始变量尝试过此操作并且有类似的经验)。
有没有办法解决这个问题并按顺序对其进行评估?或者至少要通过以下测试?我知道我可以使用不同的变量并且它会起作用,但必须有办法解决这个问题。我还想知道这是否是 Rspec 的预期效果。
关于菲利普的回答的更新
通过在单个中进行更改,它会阻止规范通过:
describe Tmp do
describe "do something" do
let(:instance) {Tmp.new}
it 'should be modifiable' do
instance.modify('hi', 'bye')
instance.values.should == {a: 'hi', b: 'bye'}
instance.modify('bye', 'hi')
instance.values.should == {a: 'bye', b: 'hi'}
end
end
end
但是,如果我使用该主题,它似乎会恢复并在第一次失败时失败
describe Tmp do
describe "do something" do
let(:instance) {Tmp.new}
subject{instance.values}
it 'should be modifiable' do
instance.modify('hi', 'bye')
should == {a: 'hi', b: 'bye'}
instance.modify('bye', 'hi')
should == {a: 'bye', b: 'hi'}
end
end
end
不知道为什么会这样。至少我看到更改应该在it块内,以更好地反映我们正在测试的更改。