Тестирование аутентифицированных загрузок файлов в merb

StackOverflow https://stackoverflow.com/questions/1242958

Вопрос

Это то, что сводило меня с ума в течение последних нескольких дней.У меня есть действие, которое позволяет прошедшим проверку подлинности пользователям загружать ресурсы на сайт.Я знаю, что действие контроллера правильное, поскольку я могу запустить процесс вручную, однако я хочу протестировать его с помощью 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top