Я пытаюсь использовать несколько вариантов для проверки ответа 200 Ok HTTP с Capybara, но не из них не работает:
response.should be_success
page.status.should be(200)
page.response.status.should == 200
Есть ли еще один?
Я пытаюсь использовать несколько вариантов для проверки ответа 200 Ok HTTP с Capybara, но не из них не работает:
response.should be_success
page.status.should be(200)
page.response.status.should == 200
Есть ли еще один?
Я нашел его:
page.status_code.should be 200
И он отлично работает!!!
Поскольку текущая версия RSpec выдает предупреждение об устаревании, я бы предложил изменить ваше решение на:
expect(page.status_code).to be(200)
Это работает для меня.
P.S. Предупреждение об отказе является следующим:
DEPRECATION: использование
should
из rspec-ожиданий 'old:should
синтаксис без явного включения синтаксиса устарел. Использовать новый синтаксис:expect
или явно включите:should
.
оба ответа, и спрашивающий не сказал, какой драйвер они используют. Его важная информация, которая делает разницу. Чтобы предоставить полную информацию, этот не работает с selenium webdriver, хотя работает с драйверами poltergeist и capybara-webkit
Selenium досадно не предоставляет никаких данных заголовка или HTTP-статуса, поэтому я написал это промежуточное программное обеспечение, чтобы вставить комментарий HTML, содержащий код состояния HTTP для использования с Capybara.
module Vydia
module Middleware
class InjectHeadersForSelenium
def initialize(app)
@app = app
end
def call(env)
@status, @headers, @response = @app.call(env)
if @headers["Content-Type"] && @headers["Content-Type"].include?("text/html")
@prepend = "<!-- X-Status-Code=#{@status} -->\n"
@headers = @headers.merge(
"Content-Length" => (@headers["Content-Length"].to_i + @prepend.size).to_s
)
end
[@status, @headers, self]
end
def each(&block)
if @prepend
yield(@prepend)
@prepend = nil
end
@response.each(&block)
end
end
end
end
В тестах вы можете получить код состояния следующим образом:
def get_http_status
begin
page.driver.status_code
rescue Capybara::NotSupportedByDriverError
matches = /<!-- X-Status-Code=(\d{3}) -->/.match(page.body)
matches && matches[1] && matches[1].to_i
end
end
get_http_status
В качестве альтернативы вы можете использовать клиентский API Ruby Http для проверки кода ответа или ввести
В одну сторону:
response = Net::HTTP.get_response(URI.parse(current_url))
expect(response.kind_of? Net::HTTPSuccess).to be_truthy
Второй способ:
response = Net::HTTP.get_response(URI.parse(current_url))
expect(response.code.to_i.eql?(200)).to be_truthy #response.code returns the code as a string
PS: Вам не нужно скачивать какие-либо внешние гемы, так как они поставляются с библиотекой Ruby