How to test get with ID in URL (RSpec Request)

Skip to first unread message


Jan 18, 2021, 6:21:28 AMJan 18
to rspec

I am just getting started with Rails & Rspec. I have something that looks like this currently in a request spec:

describe 'GET repairs/index/1' do
let!(:repair) { FactoryBot.create(:repair) }

before do
# TODO: check if there is a better way to call the get here
get '/api/v1/repairs/' +

it 'returns status code 200' do
expect(response).to have_http_status(200)

it 'returns a valid json response' do
expect(response.content_type).to eq('application/json; charset=utf-8')

it 'returns the first repairs' do
# TODO: currently json return 6 attributes, that is why we have eq(6), we should validate attributes of object
expect(JSON.parse(response.body).size).to eq(6)

It does work; however, I am trying to understand to see how I can first build the GET request in a better way. Also, the get request returns a JSON, should I parse the JSON into a repair object and expect on the model attributes?


Jack Royal-Gordon

Jan 18, 2021, 4:07:38 PMJan 18
The answer depends on what kind of spec (controller, feature, request) you are writing, and what version of RSpec.

My answer is for the newer versions of RSpec. Older versions may require you to remove the “params:"

For controller specs, use: “get :action, params: {id: id}” where “action” is the controller action routed to by the URL.

For request specs, use “get ‘/api/v1/repairs’, params: {id: id}"

For feature specs, use “visit url” and I suppose you can use the capabilities of Rails path helpers (including #url_for) or just add it to the URL (e.g. “/api/v1/repairs?id=#i{id}"),  but I can’t find any write-ups about testing APIs with feature specs, so I’m not sure this really makes sense.

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
To view this discussion on the web visit

Deep Dhanak

Jan 18, 2021, 8:59:55 PMJan 18
Hi Jack,

Thank you for the quick response. I am currently writing a request spec; however, when I write “get '/api/v1/repairs', params: { id: }", I get text/html returned and not JSON. Not only that no breakpoint gets triggered in my controller.

I noticed that I can write this "get api_v1_path(repair)" instead and the rspec will pass but as you mentioned, it seems I should use that syntax if I write a feature spec.

Again thanks for your help.


You received this message because you are subscribed to a topic in the Google Groups "rspec" group.
To unsubscribe from this topic, visit
To unsubscribe from this group and all its topics, send an email to
To view this discussion on the web visit

Phil Pirozhkov

Jan 19, 2021, 11:22:18 AMJan 19
to Jack Royal-Gordon
Hi Deep,

Using `params` is ok. However, if you're expecting a JSON response,
you have to add this to the request.
> To view this discussion on the web visit

Jack Royal-Gordon

Jan 19, 2021, 12:21:12 PMJan 19
Hi Deep,

With a request spec, you are going through Rails routing, so I don’t think there’s anything wrong with writing “get api_v1_path(repair)”. Like I said, if you’re not running one of the more recent versions of RSpec, you would need to leave the “params:” off the parameters. So if you really want to use that form, I would recommend trying  "get ‘api_v1_repairs', id: id”.


Reply all
Reply to author
0 new messages