使用RSPEC测试与环境有关的路由

问题描述 投票:0回答:1

我有一些路线应该只存在于开发环境中,但是我无法获得用于此工作的规范。有什么想法我做错了吗?我最初在控制器规格中尝试过此方法,但后来意识到我需要:type =>:routing才能使用be_routable,因此已将其分离出来。我已经调试了,并且Rails.env具有在每种情况下期望的值。我需要重新加载路线吗?尝试执行此操作,但是找不到rspec满意的语法...

来自routes.rb的摘录:

    resources :users do
        collection do
          ...
          if Rails.env.development?
            get :new_development_account
            post :create_development_account
          end
        end
        ...

路由规格:

require 'spec_helper'

describe "routes for users controller", :type => :routing do

    context "production environment" do
      it "development routes do not exist" do
        allow(Rails).to receive(:env) { "production".inquiry }
        expect(:get => "/ims/users/new_development_account").not_to be_routable
        expect(:post => "/ims/users/create_development_account").not_to be_routable
      end
    end

    context "development environment" do
      it "development routes exist" do
        allow(Rails).to receive(:env) { "development".inquiry }
        expect(:get => "/ims/users/new_development_account").to be_routable
        expect(:post => "/ims/users/create_development_account").to be_routable
      end
    end
end

特别奇怪的是,这两项测试均未通过:

Failures:

  1) routes for users controller production environment development routes do not exist
     Failure/Error: expect(:get => "/ims/users/new_development_account").not_to be_routable
       expected {:get=>"/ims/users/new_development_account"} not to be routable, but it routes to {:action=>"show", :controller=>"ims/users", :id=>"new_development_account"}
     # /var/code/bundle/ruby/2.2.0/gems/given_core-3.5.4/lib/given/rspec/monkey.rb:31:in `handle_matcher'
     # ./spec/routing/users_controller_spec.rb:9:in `block (3 levels) in <top (required)>'
     # ./spec/support/database_cleaner.rb:18:in `block (2 levels) in <top (required)>'

  2) routes for users controller development environment development routes exist
     Failure/Error: expect(:post => "/ims/users/create_development_account").to be_routable
       expected {:post=>"/ims/users/create_development_account"} to be routable
     # /var/code/bundle/ruby/2.2.0/gems/given_core-3.5.4/lib/given/rspec/monkey.rb:21:in `handle_matcher'
     # ./spec/routing/users_controller_spec.rb:18:in `block (3 levels) in <top (required)>'
     # ./spec/support/database_cleaner.rb:18:in `block (2 levels) in <top (required)>'
ruby-on-rails rspec-rails
1个回答
0
投票

路由在应用启动时被加载一次,Rails.env将为“测试”。

通常,最好使开发环境尽可能靠近生产环境,包括路线。

如果您想在开发环境中使用一些快捷方式,则可以选择:

  1. 您可以将常规/ims/users/newcreate操作与仅在开发中有效的参数一起使用。例如,/ims/users/new?development=true还将呈现其他隐藏字段以将状态传递给create
  2. 对路径使用动态约束(这样,路径仍将在生产/测试中列出,但不可访问)
  3. 仅保留路线,并针对错误的环境在控制器中引发错误
  4. 将整个development_account功能提取到引擎中,单独测试并仅在开发中安装它(最困难的方式,并非总是可能的)

我会选择第一个选项,它很简单,封装得比较好,而且很可能您的*_development_account仍然会模仿相应的动作

© www.soinside.com 2019 - 2024. All rights reserved.