Тестирование Ruby — Airbourne Rspec API

#ruby-on-rails #ruby #api #rspec #rspec-rails

#ruby-on-rails #ruby #API #rspec #rspec-rails

Вопрос:

Я пытаюсь написать тест api, но не могу понять, как это сделать. Я преобразовал curl в ruby и получил блок, подобный приведенному ниже

 require 'net/http'
require 'uri'

uri = URI.parse("https://example.com/api/v2/tests.json")
request = Net::HTTP::Get.new(uri)
request.basic_auth("test@gmail.com", "Abcd1234")

req_options = {
  use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(request)
end  

Я написал тест, как показано ниже

 describe 'Test to GET' do
  it 'should return 200' do
  
  expect_json_types(name: :string)
  expect_json(name: 'test')
    expect_status(200)
  end
end  

Мой вопрос, как мне использовать вызов api для тестирования этого. Должен ли я добавить его в отдельный файл или в тот же файл, описанный выше. Я раньше не работал с Ruby и также не смог ничего найти в Интернете.

Ответ №1:

Вы используете airborne, который использует rest_client для выполнения вызовов API. Чтобы использовать средства сопоставления airborne ( expect_json и т.д.), вам необходимо выполнить вызов вашего API внутри теста. Это означает, что ваш тест должен выглядеть следующим образом:

 describe 'Test to GET' do
  it 'should return 200' do
    authorization_token = Base64.encode64('test@gmail.com:Abcd1234')
    get(
      "https://example.com/api/v2/tests.json",
      { 'Authorization' => "Basic #{authorization_token}" }
    )
    expect_json_types(name: :string)
    expect_json(name: 'test')
    expect_status(200)
  end
end
  

Комментарии:

1. Я пытался использовать get inside the test, но я не уверен, как использовать аутентификацию. Я должен использовать имя пользователя и пароль при вызове. Curl выглядит следующим образом «curl example.com/api/v2/tests.json -v -u test@gmail.com:Abcd1234 »

2. @Jane Я обновил свой ответ, включив в него базовую аутентификацию.

3. Я пытался использовать тот же формат для post и delete, но, похоже, delete не работает. Я получаю 401 несанкционированную ошибку. есть какие-нибудь указания? Post работает нормально.

4. Хм, методы delete и post должны работать одинаково. Может ли это быть проблемой на стороне API?

5. я попробовал это с Faraday, и delete работает с Faraday. Но с Faraday у меня, похоже, возникли проблемы с использованием Airborne expect_status или любых других утверждений, которые, похоже, работают с кодом, который вы предложили с rest_client