测试记忆

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

Man*_*lla 7

我认为你的要点很好:你要测试的是是否多次调用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)