Проводить в конечную точку не в том же модуле в модульном тесте - PullRequest
0 голосов
/ 12 апреля 2019

Я работаю над устаревшим проектом Rails 2.У меня есть MyController в Foo модуль:

module Api::Foo
  class MyController < ::ActionController::Base
    def doJob
      puts "do the job"
    end
  end
end

В маршрутах.rb у меня есть:

map.connect 'api/foo/dojob', :controller => 'api/foo/my',:action => 'doJob', :conditions => { :method => :post }

У меня есть другой контроллер, который находится за пределами модуля Foo,он находится в Bar модуле:

module Api::Bar
  class AnotherController < ::ActionController::Base
    def doCalculation
          puts "do the calculation"
    end
  end
end

В модульном тесте AnotherControllerTest как я могу отправить в конечную точку api/foo/dojob?

class Api::Bar::AnotherControllerTest < ActionController::TestCase
   def setup
   end

   test 'test internal api call' do
     # how to post to "api/foo/dojob"??
   end
end

Я пытался post "/api/foo/dojob",{},это не работает.

1 Ответ

0 голосов
/ 13 апреля 2019

Вы не можете.ActionController::TestCase абстрагирует весь этап фактического выполнения фактического HTTP-запроса.

То, что ActionController::TestCase делает, когда вы делаете get :foo, создает экземпляр Api::Bar::AnotherController и передает ему поддельный запрос.Затем он вызывает метод #foo на контроллере.В то время все это казалось отличной идеей, поскольку позволяло вам разбираться во внутренних элементах контроллеров и было немного быстрее.

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

Для проведения интеграционного тестирования, когда вы тестируете несколько контроллеров, вам нужно ActionController :: IntegrationTest .Интеграционный тест фактически отправляет HTTP-запрос на тестовый сервер.Это также более перспективная стратегия проверочных испытаний , поскольку тестирование контроллера было прекращено.

require 'test_helper'
class ApiFlowsTest < ActionController::IntegrationTest
   def setup
   end

   test 'test internal api call' do
     post "api/foo/dojob", { foo: 'bar' }
     get  "api/foo/bar"
     assert_response :success
   end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...