I’m a novice at Rspec.
Let’s say I have
expect(response).to have_http_status(200)
``
But what I want is to say that either 200 or 302 is valid.
How would I do that?
Assume
(byebug) response.status
302
``
I’ve tried
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) .
Is this the right forum to ask this question?
Maybe something like “expect([200, 302]).to include response.status_code”? (Not sure of exact syntax as I’ve been away from RSpec for a while and am not at my coding computer.)
Very close!
expect([200, 302]).to include response.status
``
Thank you so much! Your suggestion gave me a whole new understanding of Rspec
Ralph
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 Compound Expectations - RSpec Expectations - RSpec - Relish, 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