On Sunday, July 16, 2017 at 1:43:01 AM UTC+1, Ralph Shnelvar wrote:
>
>
> expect(response).to (have_http_status(200) || have_http_status(302))
>
> While syntactically valid, this doesn't work because 
> have_http_status(200)will 
> throw an exception before it gets to the have_http_status(302) .
>
> This doesn't work, but not for the reason you think. 
Calling have_http_status(200) never raises an exception. It creates a 
matcher object that the `to` method uses. The ruby || operator (one of few 
things that can't be overridden) evaluates to the first non falsy thing, so 
your code is the same as 

expect(response).to (have_http_status(200) || have_http_status(302))

Rspec (since 3.0) does however have compound / composable matchers 
(see 
https://relishapp.com/rspec/rspec-expectations/v/3-6/docs/compound-expectations,
 http://rspec.info/blog/2014/01/new-in-rspec-3-composable-matchers/)

so expect(response).to have_http_status(200) | have_http_status(302)

should work, as would things like

expect(3).to eq(2) | eq(3)

This works because | and & are overridable methods and have been defined on 
matchers to mean "create me a new matcher which matches if either argument 
matches" (or both match in the & case)

Fred

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-talk+unsubscr...@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-talk/8ef74046-a257-43cb-b2d8-dc95fa46d314%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to