Though that's not as explicit as Myron's example. I'd probably go with his.
On Fri, Nov 15, 2013 at 12:52 PM, Aaron Kromer <[email protected]>wrote: > I believe the expectation matchers also now support === in RSpec 3. So > you could write it as: > > it "works using expectation matcher" do > expect{ |b| Foo.new(&b) }.to yield_with_args instance_of Fooend > > > > On Fri, Nov 15, 2013 at 10:59 AM, Myron Marston > <[email protected]>wrote: > >> Thanks for trying out the 3.0 beta :). >> >> The yield matchers try to match the args with both `===` (for case >> equality) and `==` (for exact equality) and in 1.9+, lambda's respond to >> `===` by invoking their logic. So while it's a bit of a hack, this works: >> >> it 'works using a lambda' do >> instance = nil >> equals_the_instance = ->(arg) { arg.equal?(instance) } >> expect { |b| >> instance = Test.new(&b) >> }.to yield_with_args(equals_the_instance) >> end >> >> It works because passing the lambda causes it to be lazily evaluated. >> >> That said, I don't think the `yield_with_args` matcher offers you much >> advantage in this case. It's simpler to do this: >> >> it 'works without the matcher' do >> yielded = [] >> instance = Test.new { |a| yielded << a } >> expect(yielded).to eq([instance]) >> end >> >> HTH, >> Myron >> >> On Friday, November 15, 2013 2:36:20 AM UTC-8, Maurizio De Santis wrote: >>> >>> Hello, >>> >>> I'm using rspec 3.0.0.beta1. I'm trying to test for yield self. Example: >>> >>> class Test >>> def initialize >>> yield self if block_given? >>> end >>> end >>> >>> I can't figure out how to test it. This is the closest successful test I >>> wrote: >>> >>> describe Test do >>> context 'giving a block with one argument' do >>> it 'yields itself' >>> expect { |b| described_class.new &b }.to yield_with_args >>> described_class >>> end >>> end >>> end >>> >>> But it tests only the yield argument type, not the object identity. >>> >>> This is a failing test that goes close to the wanted result: >>> >>> describe Test do >>> context 'giving a block with one argument' do >>> it 'yields itself' >>> instance = nil >>> expect { |b| >>> instance = described_class.new &b >>> }.to yield_with_args instance >>> end >>> end >>> end >>> >>> Indeed it fails, since that at the time that the last instanceoccurrence is >>> evaluated its value is >>> nil, so it doesn't match with instance value at the block evaluation >>> time. >>> >>> Do you have some ideas about? >>> >>> Thank you >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "rspec" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/rspec/2fea7ccd-d18b-48c4-a47b-aa1baa7c307f%40googlegroups.com >> . >> >> For more options, visit https://groups.google.com/groups/opt_out. >> > > -- You received this message because you are subscribed to the Google Groups "rspec" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/CAKCESdgOWn6kjtqh7dkeHRXZZSTtMD3xsJK2tZzx-r1nONd2jw%40mail.gmail.com. For more options, visit https://groups.google.com/groups/opt_out.
