在测试我的控制器时,我实际上遇到了一种奇怪的行为。我有一个UsersController
有两种方法,me
和update_me
:
class UsersController < ApplicationController
def me
# some code
end
def update_me
# some code
end
end
和相应的路线是:
Rails.application.routes.draw do
get :me, to: 'users#me'
patch :me, to: 'users#update_me'
end
测试GET /me
时,一切正常,所有测试都通过:
RSpec.describe Api::V1::UsersController do
describe '#me' do
it 'respond with a 200 ok status' do
get :me, format: :json, access_token: user_token.token
expect(response.status).to eq 200
end
# more tests
end
end
但是当我试图向我发出补丁请求时:
RSpec.describe Api::V1::UsersController do
describe '#update_me' do
it 'respond with a 200 ok status' do
patch :me, format: :json, user: attributes, access_token: user_token.token
expect(response.status).to eq 200
end
# more tests
end
end
RSpec实际上在UsersController
的第17行显示错误,这实际上是与def me
方法相关的行,它实际上应该是def update_me
。
所以我在raise
中放了一个update_me
,并意识到这个方法实际上从未被RSpec调用过。但是,在使用Postman测试真实案例场景时,一切正常,我可以get
和patch
用户正确。
任何帮助将不胜感激。
答案 0 :(得分:1)
get
和patch
方法不会将路由作为第一个参数,它们会在您正在测试的控制器中获取操作的名称。您也在me
电话中调用patch
方法,这就是为什么它会去那里。有关详细信息,请参阅RSpec controller test documentation和基础Rails controller test documentation。