Thanks, Phil. I didn’t know about the anything matcher — that’s exactly what 
I’m looking for. 

And, BTW, “self” did work. I’m mocking a helper called by another helper in the 
same file; I figured since I can call the helper being tested directly as a 
method of self, then I must be able to refer to the secondary helper as a 
method of self also. There might be a better/more elegant way to do it, but I 
couldn’t find it. I did try using the name of the Helper module, and it did 
resolve successfully but then the test indicated that it was called zero times 
instead of one, so I apparently got a different method/class. I can’t imagine 
what I would assign to subject to make usable.

> On Aug 12, 2020, at 4:31 PM, Phil Pirozhkov <[email protected]> wrote:
> 
> Hi Jack,
> 
> I suggest you use the `anything` argument matcher 
> https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/setting-constraints/matching-arguments
>  
> <https://relishapp.com/rspec/rspec-mocks/v/3-9/docs/setting-constraints/matching-arguments>
>  for the first argument.
> To my best knowledge, `with` works quite fine with argument matchers, so the 
> following passes:
> ```
> class A
>   def x
>     y(1, 2)
>   end
> 
>   def y(a, b)
>   end
> end
> 
> RSpec.describe 'A' do
>   specify do
>     a = A.new
>     expect(a).to receive(:y).with(anything, be_even)
>     a.x
>   end
> end
> ```
> 
> 
> No, I don't think `self` would work. You probably meant `subject` or a named 
> subject. You have to implicitly or explicitly define the subject, and make 
> expectations on it. https://relishapp.com/rspec/rspec-core/v/3-9/docs/subject 
> <https://relishapp.com/rspec/rspec-core/v/3-9/docs/subject>
> 
> 
> 
> I would personally recommend testing just one of the following, not both:
>  - side effect (a method called with certain arguments) - in this case, 
> `and_call_original` should be unnecessary
>  - the return value of the whole call
> 
> - Phil
> 
> 
> On Wed, Aug 12, 2020 at 3:56 AM Jack Royal-Gordon <[email protected] 
> <mailto:[email protected]>> wrote:
> At it’s simplest, the question is as follows:
> 
> If I want test a method that calls another method with two values, and I want 
> to check the value of the second argument but don’t know the value of the 
> first argument, how can I do that? In essence,
> we have m1 -> calls m2(a, b), I want to test the value of b but I don’t know 
> the value of a. If I knew both values, I could just use 
> “expect(object).to_receive(:m2).with(a, b)” But what do I use if I don’t know 
> what “a” should be (I know what class it should be, but #with is not using 
> === to compare values, so that doesn’t help.
> 
> ———  More detail that explains why I don’t know the value of “a" ———
> 
> I’m writing specs for some helpers. For one controller, I have a set of 
> helpers like follows:
> 
>       form_editing_for_type(type, &block)             ultimately generates a 
> “form_for … fields_for …” with the block inside the #fields_for
> 
>       nav_buttons(f, options)                                 generates 
> Preview, Next, Cancel buttons for the FormBuilder object “f”; “options” has 
> certain overrides for defaults; it must be called from the block              
>                                                             passed to 
> form_editing_for_type
> 
>       prev_buttom(f, options)                                 these three 
> helpers are called by nav_buttons only
>       next_button(f, options)
>       cancel_button(f, options)
> 
>       nav_button(f, name, default_label, disabled, options)
>                                                                               
> this helper is called by the above three helpers only
> 
> So far, I’m testing each helper separately (including the ones only called by 
> other helpers. The problem I’m encountering is that I want to test that the 
> “options” passed into “nav_buttons” is being passed on to “prev_button”, etc. 
> I could do that with something like the following:
>       it ‘passes “options” through” do
>         @options = ...
>         expect(self).to 
> receive(:prev_button).with(ActionView::Helpers::FormBuilder, 
> @options).and_call_original
>         form_editing_for_type(@type) { |f| 
>             nav_buttons(f, @options)
>           }
>       end
> 
> But, there are a few issues here.
> 
> 1) Is “self” the correct object to expect #prev_button to be called against?
> 2) I don’t know the exact value of the first argument to :prev_button, so how 
> do I tell expect that I don’t really know the value (I do know @options and I 
> that’s what I’m checking)? ActionView::Helpers::FormBuilder does not work 
> (apparently #with is not using “===“ to check the value).
> 
> And then, the bigger issue: does it maybe make more sense, since the last 
> four helpers are essentially private, to just test #nav_buttons for all the 
> things that I would have tested the other four helpers for? This might better 
> fit the idea of testing the desired result, not how the result is obtained.
>       
> 
> -- 
> 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] 
> <mailto:[email protected]>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rspec/5A25DDD3-BCDF-4015-BBE0-1217A24E5735%40pobox.com
>  
> <https://groups.google.com/d/msgid/rspec/5A25DDD3-BCDF-4015-BBE0-1217A24E5735%40pobox.com?utm_medium=email&utm_source=footer>.
> 
> -- 
> 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] 
> <mailto:[email protected]>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rspec/CAAk5Ok-7qKpY1%3D6c2oeqr8%2BsHWMBj-DJRYC1oLChYPdUYdpcNQ%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/rspec/CAAk5Ok-7qKpY1%3D6c2oeqr8%2BsHWMBj-DJRYC1oLChYPdUYdpcNQ%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/7FCEC1F8-563E-401E-A08E-C5763EDFF20B%40pobox.com.

Reply via email to