Rspec: expect(response).to have one of several valid values

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?

(byebug) response.status


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


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,

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)