2017-02-18 18 views
0

Я пытаюсь проверить, что, когда пользователь нажимает на ссылку, загружается файл PDF.Как обеспечить, чтобы запрос был заполнен перед заголовками тестирования?

it 'downloads a PDF', :js do 
    find("a.btn", text: %r{Download}i).trigger 'click' 
    expect(page.response_headers['Content-Type']).to eq "application/pdf" 
end 

Это провал с

expected: "application/pdf" 
got: "text/html; charset=utf-8" 

Если добавить sleep 20 перед ожиданием, тест пройден.

Есть ли лучший/более эффективный способ написать это?

По какой-то причине, следующий проходит с перерывами (даже при более длительном ожидании):

expect(page.response_headers['Content-Type']).to have_text("application/pdf", wait: 20) 

ответ

1

have_text является согласованью, который использует элемент страницы (Капибара :: Node :: Element). Когда вы используете его со строкой, строка обрабатывается в HTML-документе, а затем текстовые узлы из этого документа сравниваются, но не будут иметь никаких попыток, поскольку он не знает, как перезагрузить строку (элементы страницы хранят запрос используемые для поиска их в объекте, чтобы их можно было перезагрузить - строки нет). Чтобы получить поведение ожидания в строке от response_headers, вам нужно будет использовать что-то, которое выполняет блок, который принимает блок и повторяет попытку. https://github.com/abotalov/waiting_rspec_matchers - это один камень, который обеспечивает такую ​​функциональность, но есть и некоторые другие.

+0

Спасибо @Thomas за то, что представил меня в wait_rspec_matchers. Очень полезно и решает проблему! Любопытно, почему вы решили удалить пользовательский метод? Казалось, что он обладает потенциалом и избегает добавления другого драгоценного камня. Разве это не действительный подход? –

+1

@ AndyHarvey Это действительный подход, но я понял, что объясняю только часть запроса, по-прежнему нужна часть-созерцатель, у которой есть больше необходимых методов и будет слишком длинным/сложным для простого ответа. Если вы заинтересованные в этом подходе, вы должны взглянуть на классы TitleQuery и HaveTitle в Capybara в качестве хорошей отправной точки. –