rspec игнорирует skip_before_filter? - PullRequest
       19

rspec игнорирует skip_before_filter?

5 голосов
/ 29 февраля 2012

У нас странная проблема. В контроллере приложения у нас есть набор before_filter, который требует аутентификации с использованием devise и перенаправляет при необходимости на страницу входа.

В нашем контроллере библиотеки мы пропускаем это before_filter.

skip_before_filter :authenticate_user!, :only => :show

Когда мы запускаем простой функциональный тест с capybara и rspec, тест завершается неудачей.

it "should get only english articles within the category 'computers'" do
    visit '/en/library/computers'
    page.should have_content('computers')
end

Похоже, этот фильтр не пропущен. Содержание страницы относится к странице входа.

Когда мы запускаем это с rails server, оно отлично работает.

Есть идеи, почему он так себя ведет или что искать, чтобы решить эту проблему?

UPDATE:

Возможно, стоит добавить, что это происходит только в Linux. Под MacOS 10.7 с «такой же» настройкой все работает нормально.

Код контроллера:

class Library::CategoriesController < ApplicationController
  skip_before_filter :authenticate_user!, :only => [:show]

  # GET /categories/1
  # GET /categories/1.json
  def show

    @categories = Category.all
    @category = Category.find(params[:id])

    @articles = @category.articles.where(:locale => I18n.locale)
    respond_to do |format|
      format.html # show.html.erb
    end
  end
end

Application_controller выглядит так (без set_i18n_locale_from_url):

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_i18n_locale_from_url, :authenticate_user!
end

Маршруты:

namespace :library do
  get '/' => 'library#index', :as => 'library'
  resources :categories, :path => '', :only => [:show]
  resources :categories, :path => '', :only => []  do
    resources :articles, :path => '', :only => [:show]
  end
end

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Полагаю, первое, что вы можете сделать, это посмотреть, действительно ли "visit" / en / library / computers "вызывает действие show в вашем контроллере. Если вы используете спокойный путь, который обращается к действию show, используйте его вместо текущего URL-пути, чтобы он выглядел примерно так:

visit library_path('computers')

Затем добавьте текст отладчика (вставьте «бла») в ваш метод show, с которым вы тестируете, и убедитесь, что он подходит. Возможно, вызов строгого пути делает что-то странное с обходом before_filters.

UPDATE:

Похоже, ваш контроллер не может интерпретировать «компьютеры» как идентификатор. Внутри ваших маршрутов, что делать, если вы добавляете маршрут участника в ресурс вашей библиотеки:

resources :libraries do
  member do
    get :computers
  end
end

И в вашем контроллере добавьте:

def computers
  @categories = Category.all
end

И измените свой skip_before_filter для использования: компьютеры

1 голос
/ 10 марта 2012

Я думаю, что это как-то связано с фабриками и различными локализациями, которые мы имеем для модели категорий. Вероятно, в Linux он использует другую локаль по умолчанию и поэтому не работает.

Я удалил before_filter для аутентификации и большинство тестов прошло, но это происходит:

 1) Categories when user requests the category page 
      GET /en/library/computers 
        should get only english articles within the category computers
    Failure/Error: page.should have_content(@english_articles[0].title)
      expected there to be content "article 1 en" in "Bibliothek\nAdmin\nSign up\nLogin\n\n\n\n\n\n\n\n\nHome\n>\n\n\nLibrary\n>\n\n\Computer\n>\n\nThe spine\n\n\n\n\n\n\n\n\n\nComputer\n\n\n\n\n\n\n\n\n\n\n\n\nComputer\n\n\n\narticle 6 de\n\ncontent_6\n\n\narticle 7 de\n\ncontent_7\n\n\narticle 8 de\n\ncontent_8\n\n\narticle 9 de\n\ncontent_9\n\n\narticle 10 de\n\ncontent_10"
    # ./spec/requests/categories_spec.rb:20:in `block (4 levels) in <top (required)>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...