rspec-expectations: It would be nice to add `.to receive(...).with_block`

There is no easy way to verify a method would be called with a block.

It would be nice to have

expect(thing).to receive(:method).with_block

About this issue

  • Original URL
  • State: open
  • Created 6 years ago
  • Reactions: 1
  • Comments: 15 (7 by maintainers)

Most upvoted comments

@benoittgt I think @ioquatix is talking about receive(...) from rspec-mocks, so that you can expect to receive a message with a block. You can currently deal with this by passing a block to receive:

expect(thing).to receive(:method) do |&block|
  expect(block).not_to be_nil
end

If we wanted to add more explicit support for this, I’d rather not add a new with_block API; instead maybe something like:

expect(thing).to receive(:method).with(a_block)

Where a_block is a “special” argument matcher like any_args or no_args that doesn’t match on a positional arg but instead rspec-mocks handles internally.

@ioquatix does the approach I suggested above work for you?

I’ve expanded on @kaiwren’s work over on rspec/rspec-mocks#1237, it’s worth noting we already had the and_yield expectation, and I think there are actually a few issues with a_block, what happens when used positionally? and does it always mean the supplied &block argument? After all object.msg(proc {}, proc {}) is valid Ruby, should we expect on this with .with(a_block, a_block) and how do we differentiated that from msg(proc{}) { }.

Hopefully, yes, we could make that work.

Do you want to take a stab at adding it. Improving RSpec is largely a self-service operation unless one of the core team members wants to take this work on (which often doesn’t happen; we all have lives and jobs!).

Thanks, @myronmarston for clarification. I agree with your proposal.