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.
