【问题标题】:Minitest - test controller concernsMinitest - 测试控制器问题
【发布时间】:2014-09-19 15:20:15
【问题描述】:

我尝试使用 minitest-rails 并结合这些技术来测试我的控制器问题:

http://ridingtheclutch.com/post/55701769414/testing-controller-concerns-in-rails.

Anonymous controller in Minitest w/ Rails

我得到“没有路线匹配错误”: ActionController::UrlGenerationError: 没有路由匹配 {:action=>"index", :controller=>"fake"}

require "test_helper"
require "warden_mock"

class FakeController < ApplicationController
  attr_accessor :request

  def initialize(method_name=nil, &method_body)
    include MyConcern # method redirect_to_404 placed here

    @request = OpenStruct.new # mockup request
    @request.env = {}
    @request.env['warden'] = WardenMock.new # mockup warden

    if method_name and block_given? # dynamically define action for concern methods testing
      self.class.send(:define_method, method_name, method_body)
      test_routes = Proc.new do
        resources :fake
      end
      Rails.application.routes.eval_block(test_routes)
    end
  end
end


describe FakeController do # just very simple test
  context "just redirect_to_404" do
    it "it must redirect to /404" do
      @controller = FakeController.new(:index) { redirect_to_404 }
      get :index
      assert_redirected_to '/404'
    end
  end
end

我有 rails 4.1.5 和 minitest 5.4.0

【问题讨论】:

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


    【解决方案1】:

    对于 OP 来说可能为时已晚,但我已经这样做了:

    require 'test_helper'
    
    class SolrSearchParamsFakeController < ApplicationController
      include SolrSearchParams # this is my controller's concern to test
    
      def index
        # The concern modify some of the parameters, so I'm saving them in a
        # variable for future test inspection, so YMMV here.
        @params = params
        render nothing: true
      end
    end
    
    Rails.application.routes.draw do
      # Adding a route to the fake controller manually
      get 'index' => 'solr_search_params_fake#index'
    end
    
    class SolrSearchParamsFakeControllerTest < ActionController::TestCase
      def test_index
        get :index, search: 'asdf wert'
    
        # finally checking if the parameters were modified as I expect
        params = assigns(:params)
        assert_equal params[:original_search], 'asdf wert'
      end
    end
    

    更新

    抱歉,但实际上这会以某种方式弄乱我所有涉及路由访问的测试,就像 Rails.application.routes.draw 一样,我正在重写所有测试路由,只留下 solr_search_params_fake#index 路由。
    不知道如何添加而不是重写......修复将直接添加到 config/routes.rb 我的测试路线与 if Rails.env.test? 条件? (是的,这是一个糟糕的解决方案,但我会把它留在这里,以防有人找到更好的方法)。

    【讨论】:

    • 你可以设置Rails.application.routes.disable_clear_and_finalize = true来防止draw重写你所有的路由。它只会附加任何设置了该标志的新路由
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2013-05-28
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多