9
votes

I try to test my controller concerns using minitest-rails and combining this techniques:

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

Anonymous controller in Minitest w/ Rails

And i get "no route matches error": ActionController::UrlGenerationError: No route matches {: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

I have rails 4.1.5 and minitest 5.4.0

1

1 Answers

2
votes

Probably too late for the OP, but I've done it in this way:

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

Update

Sorry, but actually this is messing up all my tests that involve route access in some way, as with Rails.application.routes.draw I'm rewriting all the routes for tests and leaving just that solr_search_params_fake#index route.
Not sure how to add instead of rewriting.... a fix would be adding directly to config/routes.rb my test routes with an if Rails.env.test? condition? (yeah, it's a crappy solution, but I'll leave this here in case someone find a better way to do this).