Flexmock モッキング フレームワークを使用して、Rspec2 でテストを作成しています。メソッドの 1 つが結果をキャッシュすることを期待しており、これをモックで検証したいと考えています。
describe SomeClass do
before do
@mock = flexmock()
end
after do
@mock.flexmock_verify()
end
it "method caches results"
c = SomeClass.new(@mock)
c.method
@mock.should_receive(:expensive_method).never
c.method.should == ['A']
end
end
:expensive_method
決して呼び出されないようにしたい場合、これは適切に機能します。:method
ただし、渡された (モック) クラスで何も呼び出さずにクラスが実行できることを期待しています。これを表現する方法はありますか?
背景:私の場合、注入されたクラスはコストのかかる操作を実行するため、同等のクエリに対して結果をキャッシュする必要があります。
更新
これまでの提案に感謝します。おそらく、間違ったことを想定しているだけか、私が望むものが意味をなさないかもしれません。キャッシングを実装する方法は、クラス変数を保持し、SomeClass
それに追加することです:method
。
def SomeClass
@@cache_map = {}
def method
# extract key
return @@cache_map[key] if @@cache_map.has_key?(key)
# call :expensive_method to get result
@@cache_map[key] = result
return result
end
end
ここで、正しいキャッシングをテストするために、:extensive_method
少なくとも 1 回呼び出してキャッシュをロードする必要があります。私はDavid Chelimskyの解決策が好きですが、それは私の当初の意図に答えていません。つまりSomeClass.method
、注入されたクラスへの最初の呼び出しの後、二度と呼び出されないことをテストします(どちら:expensive_method
も他にもありません)。