Тестирование аутентифицированных файловых загрузок в Merb - PullRequest
0 голосов
/ 07 августа 2009

Это то, что меня бесило за последние несколько дней. У меня есть действие, которое позволяет аутентифицированным пользователям загружать ресурсы на сайт. Я знаю, что действие контроллера правильное, так как я могу выполнить процесс вручную, однако я хочу проверить его с помощью 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) не устанавливается ни для какого фиктивного объекта, который делает это через запрос.

Вопрос в следующем: собираюсь ли я найти правильный способ проверки загрузки файлов, а если нет, то каким другим способом?

1 Ответ

0 голосов
/ 13 августа 2009

Я делал это неправильно. Используя request, он вызывал to_s для всех параметров, поэтому мой фиктивный объект передавался как "# [Spec :: Mocks :: Mock: 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
...