7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Rspecのallow_any_instance_ofを書き換える

Posted at

はじめに

インスタンスメソッドのスタブを 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

Hogenew メソッドを呼ばれた際に、instance_double で作ったモックを呼ぶようにしています。
このテストも書き換え前のテスト同様ちゃんと通ります。

おわりに

今回は書き換え前後をただメモ感覚で書き殴っているだけですが、ちゃんと理解したらまた追記するなり別の場所で書くなりしたいと思います。
書き換えの方法もこればっかりではないと思うので、このあたりについてはまた記事にしたいですね。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?