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

850 views
Skip to first unread message

Frozensoil

unread,
Jan 18, 2021, 6:21:28 AM1/18/21
to rspec
Hi,

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/' + repair.id.to_s
end

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

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

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)
end
end

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?

Thanks!
 

Jack Royal-Gordon

unread,
Jan 18, 2021, 4:07:38 PM1/18/21
to rs...@googlegroups.com
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 rspec+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/270ce60b-8e73-49ea-8b34-96db0ddfbb44n%40googlegroups.com.

Deep Dhanak

unread,
Jan 18, 2021, 8:59:55 PM1/18/21
to rs...@googlegroups.com
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: repair.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.

Regards,
Deep

You received this message because you are subscribed to a topic in the Google Groups "rspec" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/rspec/Bkrojb8TGKA/unsubscribe.
To unsubscribe from this group and all its topics, send an email to rspec+un...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/5F96496F-1F0A-4F96-A8CB-9AEB3114042C%40pobox.com.

Phil Pirozhkov

unread,
Jan 19, 2021, 11:22:18 AM1/19/21
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.
https://relishapp.com/rspec/rspec-rails/v/4-0/docs/request-specs/request-spec#requesting-a-json-response
> To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/CAKW5Rd%3DaQ6j_Pu3e51_4CctR3irMo60zzmSSREk15Fg5Ae%2BWwg%40mail.gmail.com.

Jack Royal-Gordon

unread,
Jan 19, 2021, 12:21:12 PM1/19/21
to rs...@googlegroups.com
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”.

Jack

Reply all
Reply to author
Forward
0 new messages