2015-10-26 257 views
1

我的Rails应用程序中的rspec-request-test存在问题。需要用户登录的测试失败。我已根据this tutorial.实施了设计测试。我还发现了许多链接,这些链接都使用了类似的方法。例如hereRuby on Rails - Devs的Rspec测试失败

这里是我的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的测试,这是失败的:(规格/请求/ 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)>' 

Accordin克到我发现的链接,这应该工作!但它不......任何人都可以告诉我为什么?为什么会有路由错误?该应用程序本身工作正常。

+0

你是否在你的路由中设置了'root_path'?此外,我会更好地存档您的sign_in描述[这里](https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specs)比提交sign_in每个测试的请求 – AbM

+0

我的routes.rb看起来像这样(摘录):'mount Alchemy :: Engine =>'/' root to:redirect('/')' –

回答

1

发生路由错误,因为您的主机应用程序不知道引擎路由。这就是为什么您必须在当前控制器范围外的视图中使用Rail引擎的路由代理对象。请阅读更多关于轨道引擎及其路线的特点in the official rails guides

幸运的是,炼金与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

相关问题