2015-10-26 2 views
1

У меня проблема с rspec-request-test в моем приложении rails. Тесты, требующие входа пользователя, терпят неудачу. Я реализовал разработку тестов в соответствии с this tutorial.. Также я нашел много ссылок, которые используют подобный подход. например hereRuby on Rails - тест Rspec с Devise не работает

Вот отрывок из моей Gemfile:

gem 'devise', '~> 3.5' 
gem 'devise-i18n' 
gem 'devise-i18n-views' 
gem 'cancancan', '~> 1.10' 
gem 'rolify' 
gem 'alchemy_cms', '~> 3.2.0' 
gem 'rspec-core' 
gem 'rspec-rails' 
gem 'i18n-tasks', '~> 0.8.7' 
gem 'factory_girl_rails' 

Вот RSpec-тест, то есть недостаток: (SPEC/запросы/campaigns_spec.rb)

require 'rails_helper' 
RSpec.describe "Campaigns", type: :request do 
    describe "GET /campaigns" do 
    it "responds with 200" do 
     sign_in_as_a_valid_user_request 
     get campaigns_path 
     expect(response).to have_http_status(200) 
    end 
    end 
end 

Вы должны видеть эту страницу только при входе в систему. Поэтому в тесте я хочу войти в систему как пользователь (созданный с помощью FactoryGirl), чем перейти на сайт и получить 200-ответ. В самом приложении это работает хорошо.

спецификации/rails_helper.rb (экстракт)

... 
require 'spec_helper' 
require 'rspec/rails' 
require 'devise' 
require 'support/devise_support' 
ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.include FactoryGirl::Syntax::Methods 
    config.include Devise::TestHelpers, type: :controller 
    config.include Devise::TestHelpers, type: :view 
    config.include ValidUserRequestHelper 

    ... 
end 

спецификации/поддержка/devise_support.rb

module ValidUserRequestHelper 
    def sign_in_as_a_valid_user_request 
    @user ||= FactoryGirl.create :user 
    post_via_redirect user_session_path, 'user[email]' => @user.email, 'user[password]' => @user.password 
    end 
end 

здесь ошибка, что тест бросает:

1) Campaigns GET /campaigns responds with 200 
    Failure/Error: sign_in_as_a_valid_user_request 
    ActionController::RoutingError: 
    Alchemy::Page not found "/" 
    # ./spec/support/devise_support.rb:13:in `sign_in_as_a_valid_user_request' 
    # ./spec/requests/campaigns_spec.rb:6:in `block (3 levels) in <top (required)>' 

Accor ding к ссылкам, которые я нашел, это должно сработать! но это не ... Может ли кто-нибудь сказать мне, почему? Почему существует ошибка маршрутизации? Само приложение работает нормально.

+0

Вы установили 'root_path' в своих маршрутах? Кроме того, я бы лучше заглушил ваш sign_in, как описано [здесь] (https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specs), чем отправить sign_in запрос для каждого теста – AbM

+0

Мои маршруты.rb выглядит следующим образом: «mount Alchemy :: Engine => '/' root to: redirect ('/')' –

ответ

1

Ошибка маршрутизации возникает, потому что ваше хост-приложение не знает маршруты двигателей. Вот почему вы должны использовать объекты прокси-сервера маршрутизации двигателей rails во взглядах вне текущей области контроллера. Подробнее о рельсовых двигателях и характеристиках их маршрутов читайте больше. in the official rails guides

К счастью, Alchemy поставляется с a handy test helper, который решает ваши проблемы. Просто добавьте это к вашему spec_helper:

# spec/spec_helper.rb 
require 'alchemy/test_support/controller_requests' 
... 
RSpec.configure do |config| 
    config.include Alchemy::TestSupport::ControllerRequests 
    ... 
end 

Знайте, что Вы можете использовать alchemy_get вместо get в запросе спецификации.

+0

Спасибо! Некоторые «требуют» -значений в моем spec_helper, где они отсутствуют. Но после добавления их, ваше решение работает! –

+0

Замечательно. Для чего нужны заявления, где отсутствует? – tvdeyen

Смежные вопросы