はじめに
インスタンスメソッドのスタブを allow_any_instance_of
で書いていたのですが、どうやらこれが非推奨らしいので、これを書き換える方法をメモがてら記事にしました。
allow_any_instance_of を使ったテスト
テスト対象のファイルはこちら
test.rb
class Test
def test_method
hoge = Hoge.new
hoge.hello
end
end
class Hoge
def hello
"hello!"
end
end
そして allow_any_instance_of
を使ったスペックファイルがこちら
test_spec.rb
require_relative 'test'
describe 'Test' do
context 'test_method' do
before do
allow_any_instance_of(Hoge).to receive(:hello).and_return('hello!(stub)')
end
it 'returns hello!(stub)' do
expect(Test.new.test_method).to eq('hello!(stub)')
end
end
end
これでも一応動くのですが、はじめにも書いたように allow_any_instance_of
は非推奨なので、今回はこれを instance_double
を使った形に書き換えます。
instance_double を使ったテスト
先ほどのスペックファイルを instance_double
を使って書き換える
test_spec.rb
require_relative 'test'
describe 'Test' do
context 'test_method' do
it 'returns hello!(stub)' do
hoge_moc = instance_double(Hoge)
allow(Hoge).to receive(:new).and_return(hoge_moc)
allow(hoge_moc).to receive(:hello).and_return('hello!(stub)')
expect(Test.new.test_method).to eq('hello!(stub)')
end
end
end
Hoge
で new
メソッドを呼ばれた際に、instance_double
で作ったモックを呼ぶようにしています。
このテストも書き換え前のテスト同様ちゃんと通ります。
おわりに
今回は書き換え前後をただメモ感覚で書き殴っているだけですが、ちゃんと理解したらまた追記するなり別の場所で書くなりしたいと思います。
書き換えの方法もこればっかりではないと思うので、このあたりについてはまた記事にしたいですね。