rspec 2:检测对方法的调用但仍然执行其功能

时间:2011-08-26 14:44:55

标签: rspec2

我想检查一个方法是否被完全(n)次调用,但是我仍然希望该方法执行其原始函数。考虑一个简单的缩略图系统来缓存缩略图文件,并确保只在第一次请求时调用ImageMagick创建缩略图的“转换”可执行文件。

  it "this passes: should detect a cached version" do
    thumbnail_url = thumbnail_url_for("images/something.jpg")
    get thumbnail_url
    last_response.should be_ok
    Sinatra::Thumbnail.should_not_receive(:convert)
    get thumbnail_url
    last_response.should be_ok
  end

  it "this fails:  should detect a cached version" do
    Sinatra::Thumbnail.should_receive(:convert).exactly(1).times
    thumbnail_url = thumbnail_url_for("images/something.jpg")
    get thumbnail_url
    last_response.should be_ok
    get thumbnail_url
    last_response.should be_ok
 end

在我的情况下,我第一次尝试逃脱,但可能有些情况我没有。第二个失败,因为检测到调用Thumbnail.convert但方法本身没有做任何事情。有没有办法只检测对方法的调用并让它做原始的事情?

顺便说一句:我怀疑这个question非常相似,但后来我在描述中迷失了,也没有答案......

2 个答案:

答案 0 :(得分:20)

现在有一个and_call_original方法正是为了这个用例。 (RSpec 2.12)

Sinatra::Thumbnails.should_receive(:convert).and_call_original

文档可以在Joao引用的同一页面上找到,here

另见:changelog

答案 1 :(得分:15)

耶!我想我明白了!

it "should detect a cached version" do
  original_method = Sinatra::Thumbnails.method(:convert)
  Sinatra::Thumbnails.should_receive(:convert).exactly(1).times do |*args|
    original_method.call(*args)
  end
  thumbnail_url = thumbnail_url_for("images/something.jpg") # 
  get thumbnail_url
  last_response.should be_ok
  get thumbnail_url
  last_response.should be_ok
end

最后在here中记录了(在我看来很糟糕)......