Thank you.

I guess I was hoping that when the instance double verified that the 
message matches the method signature it would determine that I was trying 
to use keyword arguments instead of a hash.

Steve.

On Tuesday, 19 September 2017 14:20:10 UTC+8, Myron Marston wrote:
>
> What goal do you have in mind for this test? From the examples you gave, 
> it looks like you are only testing how RSpec’s verifying doubles work. For 
> example, this expectation:
>
> expect(html).to respond_to(:parse).with_keywords(:body, :headers)
>
> …isn’t exercising your code at all, because you’ve declared html as a 
> test double, so it’s just testing how doubles work. If you’re trying to 
> test the HTML class, you should not use a double in its place. Test doubles 
> are intended for when you want to control the environment in which you test 
> something, by replacing some collaborators with fake versions. They’re not 
> intended to ever replace the thing you are testing—once you do that, you’re 
> no longer testing the thing.
>
> Myron
> ​
>
> On Mon, Sep 18, 2017 at 11:03 PM, Steven Webb <[email protected] 
> <javascript:>> wrote:
>
>> I'm having trouble testing a method signature change from taking a single 
>> argument (a hash) to using keyword arguments. I've created a contrived 
>> example of HTML parsing to simplify things (I'm not actually writing a html 
>> parser):
>>
>> class HTML
>>   def parse(body) # body is a hash
>>     ...
>>   end
>> end
>>
>> I want to update it so that it can take an optional headers argument. It 
>> becomes:
>>
>> class HTML
>>   def parse(body: , headers: {}) # body and headers are both hashes
>>   end
>> end
>>
>> In a related unit test of a different class I'm using something like this:
>>
>> RSpec.describe "calling the parser" do
>>   let(:html) { instance_double("HTML", parse: nil) }
>>   let(:body) { double("body") }
>>   let(:headers) { double("headers") }
>>
>>   before { html.parse(body: body, headers: headers) }
>>
>>   it "allows passing optional headers" do
>>     expect(html).to have_received(:parse).with(body: body, headers: 
>> headers)
>>   end
>> end
>>
>> The problem I've got is that this test passes before updating the HTML 
>> class. After updating the HTML class it correctly detects the keywords as 
>> arguments and passes. Before it incorrectly determines the keywords are the 
>> "body" hash and passes. Both are valid ruby, but the method signature has 
>> changed (at least to me, possibly not to the VM). I tried:
>>
>> it "allows an optional headers argument" do
>>   expect(html).to respond_to(:parse).with_keywords(:body, :headers)
>> end
>>
>> but that fails (presumably the instance double is using method_missing).
>>
>>   1) calling the parser allows an optional headers argument
>>      Failure/Error: expect(html).to 
>> respond_to(:parse).with_keywords(:body, :headers)
>>        expected #<InstanceDouble(HTML) (anonymous)> to respond to :parse 
>> with keywords :body and :headers
>>      # ./spec/keyword_args_spec.rb:40:in `block (2 levels) in <top 
>> (required)>'
>>
>> Can anyone explain how I should be testing this correctly?
>>
>> Thanks
>>
>> Steve.
>>
>> -- 
>> 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] <javascript:>.
>> To post to this group, send email to [email protected] <javascript:>
>> .
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/rspec/8dbe9153-45c0-44f7-a0be-e6fa6ceffd7e%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/rspec/8dbe9153-45c0-44f7-a0be-e6fa6ceffd7e%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
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/98845c6c-b5a2-4af8-8933-2abcea4b1168%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to