RSpec で should_* の忘れを検出する

  • 15
    Like
  • 0
    Comment
More than 1 year has passed since last update.

(http://blog.sorah.jp/2012/12/17/rspec-warn-for-no-expectations の日本語訳にちょっと足した物です)

RSpec で it { 1 == 2 } とかしてもテストはコケない! でも人間たまに忘れる! どうすれば!

RSpec.configure do |config|
  config.after(:each) do
    result = self.example.metadata[:execution_result]
    hasnt_mock_expectations = RSpec::Mocks.space.instance_eval{receivers}.empty?
    if !result[:exception] && !result[:pending_message] && !RSpec::Matchers.last_should && hasnt_mock_expectations
      $stderr.puts "[WARN] No expectations found in example at #{self.example.location}: Maybe you forgot to write `should` in the example?"
    end
  end
end

RSpec.configure ブロックの中にこの config を書くだけで、忘れてそうな場合に警告を出してくれます!

やっている事

  • example が成功しているかどうかを確認 (result)
  • rspec-mocks で should_receive が定義されているかを無理やり確認 (has_mock_expectations)
  • should を一度も利用してない (RSpec::Matchers.last_should が空っぽ) な事を確認

    • last_should は it { should … } で example の description を生成するのに利用されています。

残念な点

  • 少々黒魔術的。rspecのバージョンアップで死ぬ可能性がある。
  • なので、rspec-core にプルリクエストを出そうとしたけれど、rspec-mocks や expectations に変な結合をしてしまうのでどうしたらいいか issue で相談したりした。 https://github.com/rspec/rspec-core/issues/759

ポイント

  • rspec-core の lib/rspec/core/example.rb と lib/rspec/core/example_group.rb は読んでおくとはかどります。