[RSpec 3] RSpec の () と {} の違い

matcher がブロックを受け取れるかどうかで使い分ける。

症状

expect { result }.to と書くと、

  describe '#map_upto' do
    let(:result) { @fizz_buzz.map_upto(15, @fizz_buzz.method(:fizzbuzz)) }
    it '' do
      expect { result }.to eq(@ans)
    end
  end

rspec の実行で止まる。

Failures:
  1) FizzBuzz#map_upto
     Failure/Error: expect { result }.to eq(@ans)
       You must pass an argument rather than a block to use the provided matcher (eq [1, 2, "Fizz", 4, "Buzz", "Fizz", 7, 8, "Fizz", "Buzz", 11, "Fizz", 13, 14, "FizzBuzz"]), or the matcher must implement `supports_block_expectations?`.
     # ./spec/fizzbuzz_spec.rb:20:in `block (3 levels) in <top (required)>'

表示のとおり

You must pass an argument rather than a block to use the provided matcher

eq という matcher がブロックを受け取れないから。
引数でないとダメと言われている。

対応

expect(result).to でエラーなしとなる。

  describe '#map_upto' do
    let(:result) { @fizz_buzz.map_upto(15, @fizz_buzz.method(:fizzbuzz)) }
    it '' do
      expect(result).to eq(@ans)
    end
  end

ドキュメントをよく見ると、小括弧 () と中括弧 {} が使い分けられていた。

もう少し調査すると、ソースを読まれている方がいた。