新手问题 Rspec 为不同的控制器写登录 Helper

knh190 · 2016年06月04日 · 最后由 knh190 回复于 2016年06月05日 · 2384 次阅读

我在控制器下面需要登录才能操作一些东西,写了个 Helper 如下:

module TestHelpers
    # helper for controller
    def login_admin
        :available

        params = { ... }
        post user_session_path, params # bug
    end
end

然而在 include 以后控制器测试中,却自动调用当前测试的控制器,不是使用路由中为 user_session_path 定义的控制器,登录失败:

RSpec.describe Admin::SomethingController, :type => :controller do
    it 'should login as admin' do
        login_admin # fail
        expect(current_user).to_not eq(nil)
    end
end

错误如下:

ActionController::RoutingError:
       No route matches {..., :controller=>"admin/something", :action=>"/users/sign_in"}

怎么向特定控制器发送请求呢?谷歌的结果是不能这么干?

把 type 变为 request,这个请求使用的就是指定的 path

RSpec.describe Admin::SomethingController, type: :request do
  it 'should login as admin' do
    get '/path'
  end
end

这种已经不是单纯的测试 controller 了,如果是题主说的只是因为测试 controller 的时间需要用户登陆的话,建议直接请求的传入 session 来使用特定的用户,如果是 API token 的话,就是传入用户 token 数据了

RSpec.describe Admin::SomethingController, type: :controller do
  it 'should login as admin' do
    get :action_name, params, session
  end
end

#1 楼 @xjz19901211 谢谢!测试了一下搞定了。 之前遗留下来的代码一个测试都没有,确实比较麻烦。实际上是应该开放控制器 API 的,但是文档完全没有写,有的功能可以用 post/get 等方法,有的功能又只能使用 devise 的 session(和 rspec 默认使用的 session 不是同一个),重写测试确实头痛。登录过后就有这种问题。 多的不说了,现在这个问题解决就行。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号