Каков ожидаемый формат URL при отправке запроса из теста контроллера? - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть маршрут, который выглядит следующим образом в моем приложении Rails:

Rails.application.routes.draw do
  scope module: "api" do
    namespace :v1 do
      # snip
      post "my_route", to: "my_controller#my_action"

Я пытаюсь написать тест контроллера для этого действия:

RSpec.describe Api::V1::MyController, type: :controller do
  describe "POST my_route" do
    it "should respond with a 200 status" do
      post "api/v1/my_route"
      expect(response.status).to eq(200)
    end
  end
end

Когда я делаю это, мой тест не проходит с ошибкой ActionController::UrlGenerationError.

Какую строку мне следует использовать в моем вызове post, чтобы RSpec правильно соответствовал моему маршруту, когда он имитирует запрос? (Обратите внимание, что мой контроллер находится в модуле Api::V1; я не уверен, имеет ли это значение или нет.)

Я пробовал:

  • "api/v1/my_route"
  • "/api/v1/my_route"
  • "v1/my_route"
  • "/v1/my_route"
  • "my_route"
  • "/my_route"

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


Есть много других вопросов о UrlGenerationError в тестах RSpec. Никто из них не помог мне, потому что все они, кажется, используют встроенные маршруты Rails, такие как :index или :create. Я указал свои действия и маршрут напрямую, поэтому я не могу полагаться на столько магии Rails.

Я полагаю, что если бы я знал, какой формат RSpec ожидает от меня для строки пути, которую я передаю post, я смог бы выяснить это очень быстро. К сожалению, мне было трудно найти соответствующие документы. Кажется, что большая часть документации RSpec основана на демонстрации тестов, и опять же, поскольку я не использую много магии Rails, их примеры не показывают мне, что я должен делать. Какой формат строки URL я должен использовать? Не могли бы вы указать мне соответствующие документы?

1 Ответ

0 голосов
/ 02 октября 2018

Пути RSpec контроллера не предполагают, что вы будете использовать маршруты, указанные в config/routes.rb, при моделировании запросов. Вместо этого используйте имена методов на самих контроллерах.

В моем примере у меня есть этот маршрут:

Rails.application.routes.draw do
  scope module: "api" do
    namespace :v1 do
      # snip
      post "my_route", to: "my_controller#my_action"

А этот контроллер:

module Api
  module V1
    class MyController
      def my_action
      # snip

Таким образом, название маршрута - my_route, а имя метода контроллера - my_action. При написании соответствующего контрольного примера мне нужно сослаться на my_action, метод, а не my_route, маршрут.

Вот так:

RSpec.describe Api::V1::MyController, type: :controller do
  describe "POST my_route" do
    it "should respond with a 200 status" do
      post "my_action"
      expect(response.status).to eq(200)
    end
  end
end

(Хотя я сначала обнаружил, что это не интуитивно понятно, но теперь я думаю об этом, имеет смысл. Он отделяет тесты контроллера от конфигурации маршрутов, делая тесты менее хрупкими.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...