Rspec тестирование ограничений условной маршрутизации - PullRequest
3 голосов
/ 29 сентября 2011

Я пытаюсь написать несколько интеграционных тестов rspec, чтобы проверить правильность маршрутизации моих условных маршрутов, но у меня куча проблем.

В маршрутах .rb:

root :to => "error#ie6", :constraints => {:user_agent => /MSIE 6/}
root :to => "protocol_sets#index", :constraints => UserRoleConstraint.new(/doctor/i)
root :to => "refill_requests#create", :constraints => UserRoleConstraint.new(/member/i)
root :to => "refill_requests#create", :constraints => {:subdomain => "demo"}
root :to => "site#index"

В спецификации / запросы / homepage_routing_spec.rb

require 'spec_helper'

describe "User Visits Homepage" do
  describe "Routings to homepage" do
    it "routes / to site#index when no session information exists" do
      visit root_path      
    end
  end
end

При попытке запустить тест я получаю следующую ошибку.

Failures:

  1) User Visits Homepage Routings to homepage routes / to site#index when no session information exists
     Failure/Error: visit root_path
     NoMethodError:
       undefined method `match' for nil:NilClass
     # :10:in `synchronize'
     # ./spec/requests/homepage_routings_spec.rb:6:in `block (3 levels) in '

Finished in 0.08088 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/requests/homepage_routings_spec.rb:5 # User Visits Homepage Routings to homepage routes / to site#index when no session information exists

От Googling вокруг, я предполагаю, что может быть проблема с тем, как rspec / capybara обрабатывают условные маршруты.

Есть ли способ проверить ограничения на маршрутах с помощью rspec и capybara?

Ответы [ 2 ]

1 голос
/ 18 декабря 2015

Поскольку это сводило меня с ума в последние дни, я нашел решение с помощью коллеги.

При использовании именованных ограничений маршрута, таких как UserRoleConstraint в примере, я прибегал к фактической заглушкеmatches? метод ограничения в спецификациях, которые в нем нуждались, то есть:

describe 'routing' do
  context 'w/o route constraint' do 
    before do
      allow(UserRoleConstraint).to receive(:matches?).and_return { false }
    end

    # tests without the route constraint
  end
  context 'w/ route constraint' do 
    before do
      allow(UserRoleConstraint).to receive(:matches?).and_return { true }
    end
  end

  # tests with the route constraint
end

Обратите внимание, что для этого необходимо иметь именованные ограничения, которые могут не применяться в вашем случае.

0 голосов
/ 04 сентября 2012

Для ограничения протокола вы можете просто указать весь URL с фиктивным доменом. См. этот ответ .

...