Нет параметров запроса в ограничении при тестировании маршрута - PullRequest
4 голосов
/ 03 января 2012

Когда я запускаю это на практике, это работает, но я не могу написать рабочий тест для ограничения маршрута с помощью rspec.

Когда тест выполняется, ограничение срабатывает, но параметры запроса пусты, поэтому он не проверяется и тест не пройден.

Я использую Rails 3.0.9, rspec-rails 2.6.1 и rspec 2.6.0.

конфиг / routes.rb

match ":param1-unique-:param2" => "controller#index",
  :constraints => ParamConstraint.new

Библиотека / param_constraint.rb

class ParamConstraint
  def matches?(request)
    @request ||= request
    valid_param1? && valid_param2?
  end

  def valid_param1?
    @request.params[:param1] == "lorem"
  end

  def valid_param2?
    @request.params[:param2] == "ipsum"
  end
end

спецификация / маршрутизация / param_constraint_spec.rb

require 'spec_helper'

describe "param constraint routing" do
  it "recognizes route for param1 and param2" do
    { :get => "/lorem-unique-ipsum" }.
      should route_to(
        :controller => "controller",
        :action => "index",
        :param1 => "lorem",
        :param2 => "ipsum"
      )
  end
end

Обновление

Если я проверяю запрос в ограничении, я получаю следующий вывод:

#<ActionDispatch::Request:0x007fee140ff910 @env={
  "rack.version"=>[1, 1],
  "rack.input"=>#<StringIO:0x007fee1446da48>,
  "rack.errors"=>#<StringIO:0x007fee1446e768>,
  "rack.multithread"=>true,
  "rack.multiprocess"=>true,
  "rack.run_once"=>false,
  "REQUEST_METHOD"=>"GET",
  "SERVER_NAME"=>"example.org",
  "SERVER_PORT"=>"80",
  "QUERY_STRING"=>"",
  "PATH_INFO"=>"/lorem-unique-ipsum",
  "rack.url_scheme"=>"http",
  "HTTPS"=>"off",
  "SCRIPT_NAME"=>"",
  "CONTENT_LENGTH"=>"0"
}>

Ответы [ 2 ]

2 голосов
/ 09 января 2012

Я столкнулся с этой же проблемой сегодня, в поисках ответа привел меня к вопросу этой страницы.Что бы это ни стоило, мне пришлось вместо этого прибегнуть к написанию спецификации запроса.

context "passing params that satisfy ParamConstraint" do
  before do
    visit "/lorem-unique-ipsum"
  end
  it "should serve up a page with content" do
    # replace this with some assertion that gets satisfied by
    # pages served up when ParamConstraint.new.matches? returns true
    page.should have_selector("html body div#foo")
    page.should_not have_selector("html body div#bar")
  end
 end
context "passing params that DO NOT satisfy ParamConstraint" do
  before do
    visit "/other-unique-other"
  end
  it "should serve up a page with different content" do
    # replace this with some assertion that gets satisfied by
    # pages served up when ParamConstraint.new.matches? returns false
    page.should_not have_selector("html body div#foo")
    page.should have_selector("html body div#bar")
  end
 end

Это не отвечает на ваш вопрос, который я считаю "как проверить ограничение маршрутизации", как правильныйбудет через спецификацию маршрутизации.Но учитывая этот пробел в том, как request.params работает, когда вы используете «should route_to», это обходной путь.Спецификация запроса, в отличие от спецификации маршрутизации, будет правильно заполнять request.params.

0 голосов
/ 24 мая 2016

Та же проблема существует спустя годы, с rspec-core 3.4.4, rspec-rails 3.4.2, rails 4.2.6. У меня нет времени, чтобы понять, почему именно ...

Вы можете использовать спецификацию запроса, как предложено выше, но не используйте ее для проверки содержимого страницы. Вместо этого скопируйте тест маршрутизации (route_to), проверив преобразование путей URL в параметры запроса:

RSpec.describe 'routes', type: :request do
  describe '/:slug' do
    it 'routes correctly' do
      get '/test-product-slug'
      expect(request.params).to eq(
        'controller' => 'product',
        'action' => :index,
        'slug' => 'test-product-slug'
      )
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...