【问题标题】:Controller test routing error with minitest-rails and rails 4.1minitest-rails 和 rails 4.1 的控制器测试路由错误
【发布时间】:2014-04-29 20:47:34
【问题描述】:

minitest/minitest-rails 出现以下“无路由匹配”错误:

  1) Error:
SessionsController::#create#test_0002_get authenticated user session:
ActionController::UrlGenerationError: No route matches {:action=>"create", :controller=>"sessions"}
    test/controllers/sessions_controller_test.rb:30:in `block (3 levels) in <top (required)>'

但其他 get :newget :destroy 路线都很好。这是 test/controllers/sessions_controller_test.rb

require "test_helper"

describe SessionsController do
  describe "#new" do
    it "GET, /signin" do
      get :new
      assert_response 302
    end

    it "GET, /auth/github" do
      get :new
      assert_redirected_to '/auth/github'
    end
  end

  describe "#create" do
    specify { request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:github] }

    it "get authenticated user session" do

  --> get :create
      ...
    end
  end

   describe "#destroy" do
    it "GET, /signout and reset_session" do
      get :destroy
      session[:user_id].must_equal nil
    end

    it "GET, / by redirect_to root_url" do
      get :destroy
      assert_response 302
      assert_redirected_to root_path
    end
  end

end

这是控制器:

class SessionsController < ApplicationController
  def new
    redirect_to '/auth/github'
  end

  def create
    auth = request.env["omniauth.auth"]
    user = User.where(:token => auth['credentials']['token']).first ||
           User.create_with_omniauth(auth)
    reset_session
    session[:user_id] = user.id.to_s
  end

  def destroy
    reset_session
    redirect_to root_url, :notice => 'Signed out!'
  end
end

路线:

$ rake routes|grep session
auth_github_callback GET   /auth/:provider/callback(.:format) sessions#create
              signin GET   /signin(.:format)                  sessions#new
             signout GET   /signout(.:format)                 sessions#destroy

$ grep session config/routes.rb:

  get '/auth/:provider/callback' => 'sessions#create', :as => :auth_github_callback
  get '/signin' => 'sessions#new', :as => :signin
  get '/signout' => 'sessions#destroy', :as => :signout

从 Gemfile.lock 中提取 minitest 相关性:

      minitest (~> 5.1)
    minitest (5.3.3)
    minitest-capybara (0.6.1)
      minitest (~> 5.0)
    minitest-metadata (0.5.0)
      minitest (>= 4.7, < 6.0)
    minitest-rails (2.0.1)
      minitest (>= 5.3.3, < 6.0)
    minitest-rails-capybara (2.0.0)
      minitest-capybara (~> 0.6.1)
      minitest-metadata (~> 0.5.0)
      minitest-rails (~> 2.0.0)
  minitest-rails-capybara

应用程序在 Rails 4.1.0 / ruby​​ 2.1.1p76 上运行。

应用程序在开发中运行良好,这让我觉得测试路由出了点问题,有些路由很好,只是创建失败。

直到现在,我都不知道在哪里看。

【问题讨论】:

    标签: ruby-on-rails ruby testing tdd minitest


    【解决方案1】:

    路由预计 :provider 存在。您没有指定值,因此路由器无法将请求与控制器操作匹配。尝试将您的测试更改为以下内容:

    get :create, provider: "github"
    

    如果您在不提供 :id 值的情况下调用 show 操作,则会遇到同样的错误。

    【讨论】:

    • 调试提示是运行bin/rake routes | grep sessions,您将在输出中看到所需的参数。感谢@blowmage 的轻推,它让我朝着正确的方向前进,但我有一个不同的必需参数名称,所以我也想为其他人添加一个额外的小提示:-)
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多