Rspec Rails错误:相同的路由名称,不同的动词

时间:2015-09-23 12:19:18

标签: rspec ruby-on-rails-4.2

在测试我的控制器时,我实际上遇到了一种奇怪的行为。我有一个UsersController有两种方法,meupdate_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测试真实案例场景时,一切正常,我可以getpatch用户正确。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

getpatch方法不会将路由作为第一个参数,它们会在您正在测试的控制器中获取操作的名称。您也在me电话中调用patch方法,这就是为什么它会去那里。有关详细信息,请参阅RSpec controller test documentation和基础Rails controller test documentation