Aus*_*tin 7 ruby testing unit-testing rspec
我有一个叫做昂贵的方法calculate_total.我需要一个调用的方法total来返回结果calculate_total.后续调用total应该返回之前的结果calculate_total.
我想以测试驱动的方式做到这一点.这是我的测试(我正在使用RSpec):
describe Item do
describe "total" do
before do
@item = Item.new
@item.stub!(:calculate_total => 123)
end
it "returns the calculated total" do
@item.total.should == 123
end
it "subsequent calls return the original result" do
previous_total = @item.total
@item.total.should equal(previous_total)
end
end
end
Run Code Online (Sandbox Code Playgroud)
这不是一个好的测试,因为以下方法使测试通过,但我希望第二个测试失败:
def total
calculate_total
end
Run Code Online (Sandbox Code Playgroud)
原因是calculate_total返回一个Fixnum所以ruby没有看到结果为2个不同的对象.我期待第二次测试失败,所以我可以执行以下操作以使其通过:
def total
@total ||= calculate_total
end
Run Code Online (Sandbox Code Playgroud)
有人知道更好的测试方法吗?
我不认为这是测试它的最好/最正确的方法,但我已经确定了这个:https://gist.github.com/1207270
我认为你的要点很好:你要测试的是是否多次调用calculate_total,而这正是你正在做的事情.我可能建议的唯一区别是稍微更明确的测试:
it "subsequent calls don't calculate the total, but still return the original result" do
@item.should_receive(:calculate_total).once
2.times do
@item.total.should == 123
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1043 次 |
| 最近记录: |