Per un backend API, i test più utili sono i request spec: fanno una vera richiesta HTTP a un endpoint e verificano la risposta, dallo status code al corpo JSON.

RSpec.describe "Launches API", type: :request do
  describe "GET /launches" do
    before { create_list(:launch, 3) }

    it "restituisce 200 e la lista in JSON" do
      get "/launches"

      expect(response).to have_http_status(:ok)
      json = JSON.parse(response.body)
      expect(json.size).to eq(3)
      expect(json.first).to include("name", "provider")
    end
  end

  describe "POST /launches" do
    it "rifiuta dati non validi con 422" do
      post "/launches", params: { launch: { name: "" } }
      expect(response).to have_http_status(:unprocessable_entity)
    end
  end
end

Un request spec esercita l'intero stack (routing, controller, model, serializzazione) come farebbe un client reale. Verifichi lo status (:ok, :unprocessable_entity), la struttura del JSON e i casi d'errore.

Sono la rete di sicurezza ideale per un'API: se rompi un endpoint durante un refactor, il test te lo dice subito. Testi il contratto che offri al frontend, non i dettagli interni. E un contratto testato è un contratto di cui ti puoi fidare.