@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

<Repository (class)> yielded |nil| to block with

RSpecMockで見慣れないエラーが起こせました。 再現コードをメモります。

class Repository; end

RSpec.describe do
  it do
    expect(Repository).to receive(:doc).and_yield(nil)
    Repository.doc {}
  end
end

実行すると

~ rspec spec.rb
F

Failures:

  1) should receive doc(*(any args)) 1 time
     Failure/Error: Repository.doc {}
       #<Repository (class)> yielded |nil| to block with
     # ./spec.rb:6:in `block (2 levels) in <top (required)>'

Finished in 0.01831 seconds (files took 0.20957 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./spec.rb:4 # should receive doc(*(any args)) 1 time

ちょっとおもしろいのは

Repository.doc {|a|}

のように、ブロック引数を指定してRepository.docを呼び出すと、このエラーは出なくなります。 RSpecMockは、ブロック引数の個数を見て動きを変えているようです。