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は、ブロック引数の個数を見て動きを変えているようです。