Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang: Memintas dan mensimulasikan respons HTTP menggunakan httptest

Golang: Memintas dan mensimulasikan respons HTTP menggunakan httptest

王林
王林ke hadapan
2024-02-09 08:24:331132semak imbas

Golang:使用 httptest 拦截和模拟 HTTP 响应

Editor PHP Zimo membawakan anda artikel tentang menggunakan httptest untuk memintas dan mensimulasikan respons HTTP di Golang. Dalam artikel ini, kami akan mendalami cara menggunakan pakej httptest untuk memintas permintaan HTTP dan mensimulasikan respons untuk ujian unit dan ujian berfungsi. Dengan menggunakan httptest, kami boleh mensimulasikan respons HTTP dengan mudah dalam pelbagai senario untuk menguji ketepatan dan keteguhan kod kami. Menguasai teknik ini sangat berguna untuk pemula dan pembangun berpengalaman. Seterusnya, mari belajar tentang kaedah pelaksanaan khusus!

Kandungan soalan

Saya telah melihat pelbagai alatan berbeza yang tersedia untuk ujian olok-olok dalam golang, tetapi saya cuba menggunakan httptest untuk menyelesaikan tugasan ini. Khususnya, saya mempunyai fungsi seperti ini:

type contact struct {
  username string
  number int
}

func getResponse(c contact) string {
  url := fmt.Sprintf("https://mywebsite/%s", c.username)
  req, err := http.NewRequest(http.MethodGet, url, nil)
  // error checking
 
  resp, err := http.DefaultClient.Do(req)
  // error checking
  
  return response
}

Banyak dokumentasi yang saya baca nampaknya memerlukan penciptaan antara muka pelanggan atau pengangkutan tersuai. Adakah terdapat cara untuk mensimulasikan respons dalam fail ujian tanpa mengubah kod utama ini? Saya ingin menyimpan pelanggan saya, respons dan semua butiran berkaitan dalam panggilan getresponse 函数中。我可能有错误的想法,但我正在尝试找到一种方法来拦截 http.defaultclient.do(req) dan mengembalikan respons tersuai, adakah ini mungkin?

Penyelesaian

Saya membaca bahawa nampaknya anda perlu mencipta antara muka pelanggan

Jangan tukar kod utama ini sama sekali

Memastikan kod anda bersih ialah amalan yang baik, akhirnya anda akan terbiasa dengannya, kod yang boleh diuji adalah lebih bersih dan kod yang lebih bersih lebih boleh diuji, jadi jangan risau tentang menukar kod anda (menggunakan antara muka) supaya ia boleh menerima objek olok-olok .

Bentuk kod yang paling ringkas boleh jadi seperti ini:

package main

import (
    "fmt"
    "net/http"
)

type contact struct {
    username string
    number   int
}

type client interface {
    do(req *http.request) (*http.response, error)
}

func main() {
    getresponse(http.defaultclient, contact{})
}

func getresponse(client client, c contact) string {
  url := fmt.sprintf("https://mywebsite/%s", c.username)
  req, _ := http.newrequest(http.methodget, url, nil)
  // error checking

  resp, _ := http.defaultclient.do(req)
  // error checking and response processing

  return response
}

Ujian anda mungkin kelihatan seperti ini:

package main

import (
    "net/http"
    "testing"
)

type mockclient struct {
}

// do function will cause mockclient to implement the client interface
func (tc mockclient) do(req *http.request) (*http.response, error) {
    return &http.response{}, nil
}

func testgetresponse(t *testing.t) {
    client := new(mockclient)
    getresponse(client, contact{})
}

Tetapi jika anda lebih suka menggunakan httptest:

package main

import (
    "fmt"
    "io"
    "net/http"
    "net/http/httptest"
)

type contact struct {
    username string
    number   int
}

func main() {
    fmt.Println(getResponse(contact{}))
}

func getResponse(c contact) string {
    // Make a test server
    ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "your response")
    }))

    defer ts.Close()

    // You should still set your base url
    base_url := ts.URL

    url := fmt.Sprintf("%s/%s", base_url, c.username)
    req, _ := http.NewRequest(http.MethodGet, url, nil)

    // Use ts.Client() instead of http.DefaultClient in your tests.
    resp, _ := ts.Client().Do(req)

    // Processing the response
    response, _ := io.ReadAll(resp.Body)
    resp.Body.Close()

    return string(response)
}

Atas ialah kandungan terperinci Golang: Memintas dan mensimulasikan respons HTTP menggunakan httptest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam