Тестирование аутентифицированных загрузок файлов в merb
-
12-09-2019 - |
Вопрос
Это то, что сводило меня с ума в течение последних нескольких дней.У меня есть действие, которое позволяет прошедшим проверку подлинности пользователям загружать ресурсы на сайт.Я знаю, что действие контроллера правильное, поскольку я могу запустить процесс вручную, однако я хочу протестировать его с помощью rspec.
Я должен использовать request
помощник, чтобы я мог повторно использовать аутентифицированный сеанс, который является :given
для этого набора тестов.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
mock_file = mock("file")
mock_file.stub!(:path).and_return(file.path)
request( resource(:assets), :method => "POST",
:params => { :file =>
{:tempfile => mock_file, :filename => File.basename(file.path)} }
)
end
Если я устанавливаю точку останова внутри спецификации, все работает нормально, однако, когда я запускаю спецификацию и пытаюсь получить доступ к пути в действии контроллера через отладчик, я получаю это:
e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String
Я предполагаю, что stub!(:path)
не устанавливается для любого фиктивного объекта, который делает это через запрос.
Вопрос в том,:Правильно ли я подбираю способ тестирования загрузки файлов, и если нет, то какой есть другой способ?
Решение
Я делал это неправильно.Используя request
он вызывал to_s для всех параметров, поэтому мой макет объекта передавался как "#[Spec::Mocks::Макет:0x3fda2a4736c0 @name= \"file \"]".Это научит меня уделять больше внимания выводу исключений.
Вместо этого я должен использовать multipart_post
и отключите вызовы аутентификации в блоке.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
multipart_post( resource(:assets), :method => "POST",
:params => { :file => file } ) do |controller|
controller.stub!(:ensure_authenticated).and_return(true)
controller.session.stub!(:user).and_return(User.first)
)
end