Techioz Blog

エラーが発生するメソッドの副作用をテストする方法

概要

次のような方法があります。

def method
  # ..
  begin
    some_invokation
  rescue StandardError
    # some_other_stuff
    raise
  end
  # ..
  User.create!
end

現時点では、このメソッドが例外を発生させることをテストできます。

expect { method }.to raise_error(StandardError)

ただし、ユーザーが作成されていないこともテストしたいと思います。

expect { method }.not_to change { User.count }

それは機能しません。例外が発生したことを示しています。私は呼び出しをモックレイズしようとしました:

allow_any_instance_of(described_class).to receive(:raise)

ただし、この場合、私のメソッドは中断されず、ユーザーが作成されます。他に方法はありますか?

解決策

おそらく次のようなものでしょう:

expect { 
  method rescue nil
}.not_to change { User.count }