kevzettler
kevzettler

Reputation: 5213

How to import Rails helpers in to the functional tests

Hi I recently inherited a project in which the former dev was not familiar with rails, and decided to put a lot of important logic into the view helpers.

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
  include BannersHelper
  include UsersHelper
  include EventsHelper
end

Specifically session management. This is okay and working with the app but I am having problems writing tests for this.

A specific example. Some of the actions do a before_filter to see if a current_user is an admin. This current_user is normally set by a sessions_helper method that is shared in all our controllers So in order to properly test our controllers I need to be able to use this current_user method

I have tried this:

require 'test_helper'
require File.expand_path('../../../app/helpers/sessions_helper.rb', __FILE__)

class AppsControllerTest < ActionController::TestCase
  setup do
    @app = apps(:one)
    current_user = users(:one)
  end

  test "should create app" do
    assert_difference('App.count') do
      post :create, :app => @app.attributes
  end
end

The require statement finds the session_helper.rb okay but without the Rails magic it is not accessible in the same way with in the AppsControllerTest

How can I spoof this crazy setup to test?

Upvotes: 4

Views: 3474

Answers (4)

Chloe
Chloe

Reputation: 26294

If you want to test helpers, you can follow the example here:

http://guides.rubyonrails.org/testing.html#testing-helpers

class UserHelperTest < ActionView::TestCase
  include UserHelper       ########### <<<<<<<<<<<<<<<<<<<

  test "should return the user name" do
    # ...
  end
end

This is for unit tests on individual methods. I think that if you want to test at a higher level, and you will be using multiple controllers w/redirects, you should use an integration test:

http://guides.rubyonrails.org/testing.html#integration-testing

As an example:

require 'test_helper'
 
class UserFlowsTest < ActionDispatch::IntegrationTest
  fixtures :users
 
  test "login and browse site" do
    # login via https
    https!
    get "/login"
    assert_response :success
 
    post_via_redirect "/login", username: users(:david).username, password: users(:david).password
    assert_equal '/welcome', path
    assert_equal 'Welcome david!', flash[:notice]
 
    https!(false)
    get "/posts/all"
    assert_response :success
    assert assigns(:products)
  end
end

Upvotes: 2

marzapower
marzapower

Reputation: 5611

To be able to use Devise in your tests, you should add

include Devise::TestHelpers

to each ActionController::TestCase instance. Then in the setup method you do

sign_in users(:one)

instead of

current_user = users(:one)

All your functional tests should work fine, then.

Upvotes: -1

Shawn Deprey
Shawn Deprey

Reputation: 525

Why re-factor? You can very easily include helpers from your project in your tests. I did the following to do so.

require_relative '../../app/helpers/import_helper'

Upvotes: 1

kevzettler
kevzettler

Reputation: 5213

The only solution i found was to re-factor and use a decent auth plugin

Upvotes: 1

Related Questions