Как протестировать фильтры контроллеров в Ruby on Rails и Test::Unit
У нас есть большое приложение на Ruby on Rails со множеством фильтров. Некоторые из этих фильтров могут быть сложными. Я ищу способ индивидуально протестировать эти фильтры с помощью модульного теста. Прямо сейчас я проверяю их, проверяя их с помощью действия, которое использует их с функциональным тестом. Это просто не похоже на правильный путь.
У кого-нибудь есть совет или опыт с этим?
6 ответов
Помните, что фильтр - это всего лишь метод.
Учитывая это:
class SomeController
before_filter :ensure_awesomeness
...
end
Там нет причин, вы не можете просто сделать это:
SomeController.new.ensure_awesomeness
а затем проверьте, что он вызывает redirect_to или что он должен делать
Вы можете тестировать с этим кодом:
require "test_helper"
describe ApplicationController do
context 'ensure_manually_set_password' do
setup do
class ::TestingController < ApplicationController
def hello
render :nothing => true
end
end
NameYourApp::Application.routes.draw do
get 'hello', to: 'testing#hello', as: :hello
end
end
after do
Rails.application.reload_routes!
end
teardown do
Object.send(:remove_const, :TestingController)
end
context 'when user is logged in' do
setup do
@controller = TestingController.new
end
context 'and user has not manually set their password' do
let(:user) { FactoryGirl.build(:user, manually_set_password: false) }
setup do
login_as user
get :hello
end
should 'redirect user to set their password' do
assert_redirected_to new_password_path(user.password_token)
end
end
end
end
end
Это код от http://robots.thoughtbot.com/testing-a-before-filter, я изменил для Rails 3
У меня есть пост о модульном тестировании before_filters легко, вы можете посмотреть. Надеюсь, это поможет.
Это зависит от того, что делают ваши фильтры.
Это: http://movesonrails.com/journal/2008/1/23/testing-your-application-controller-with-rspec.html
А также изучение того, как использовать мокко, поможет вам в этом.
Орион, я сталкивался с этим в нескольких случаях. Кроме того, большую часть времени фильтры являются частными, поэтому вам нужно отправить:
SomeController.new.send(:some_filter)
Я сталкивался с этой проблемой.
Как насчет фильтров, которые выполняют действия, требующие запроса. то есть используя Flash
В качестве примера используется метод Authlogic require_user, который не будет работать только с помощью ApplicationController.new.send (: some_filter).
У кого-нибудь есть какие-то нехакерские идеи о том, как проверить подобные вещи в изоляции? (Я делаю это, создавая дополнительный фиктивный контроллер, который я использую только для тестирования.)