Тестирование зависимой от среды маршрутизации с RSPEC - PullRequest
1 голос
/ 09 января 2020

У меня есть несколько маршрутов, которые должны существовать только в среде разработки, но я не могу получить спецификации для этой работы. Есть идеи, что я делаю не так? Я сначала попробовал это в контроллере spe c, но потом понял, что мне нужно: type =>: маршрутизация для использования be_routable, поэтому выделил это. Я отладил и Rails.env имеет значения, которые я ожидаю в каждом контексте. Нужно ли перезагрузить маршруты? Попытка сделать это, но не может найти синтаксис, которым rspe c доволен ...

Фрагмент от routs.rb:

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

Routing spe c:

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)>'

1 Ответ

0 голосов
/ 09 января 2020

Маршруты загружаются один раз при запуске приложения, и Rails.env будет «тестовым».

Обычно лучше поддерживать среду разработки как можно ближе к рабочей среде, включая маршруты.

Если вам нужны ярлыки в dev env, есть варианты:

  1. Вы можете использовать обычные действия /ims/users/new и create с параметром, который будет влиять только на разработку. Например, /ims/users/new?development=true, который также отобразит дополнительное скрытое поле для передачи состояния в create
  2. Использование динамических c ограничений на маршруты (таким образом, маршруты все равно будут перечислены в производстве / тестировании, но недоступны)
  3. Просто оставьте маршруты как всегда присутствующими и выдайте ошибку в контроллере для неправильных сред
  4. Извлеките всю функцию development_account в движок, протестируйте отдельно и смонтируйте его только в разработке (самый сложный способ, не всегда возможно)

Я бы go с первым вариантом, он простой, относительно неплохо инкапсулирует и, скорее всего, ваши *_development_account mimi c соответствующие действия в любом случае

...