es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo simular una solicitud http externa a una API durante una prueba de integración en Golang.

Tengo un servicio para obtener datos de la base de datos y obtener otros datos de una API de terceros.

Así es como se ve:

type Service interface {
     GetDataFromDB(params apiParams, thirdClient ApiCient)
}

type Repository interface {
     GetDataFromDB(orm *gorm.DB)
}

type DataService struct {
     repo Repository
}

func (s *DataService) GetDataFromDB(params apiParams, thirdClient ApiClient) []interface{} {
     var result []interface{}
     dataFromDb := s.repo.GetDataFromDB()
     dataFromAPI := thirdClient.Do(url)
     result = append(result, dataFromDb)
     result = append(result, dataFromAPI)
     return result
}
func getData(c *gin.Context) {
     //ya se implementó la interfaz
     repo := NewRepository(orm)
     srv := NewService(repo)
     thirdPartyClient := NewApiClient()
     params := &params{Id:1,Name:"hello world"}
     res := srv.GetDataFromDB(params, thirdPartyClient)
     c.JSON(200,res)
}
func TestGetData(t *testing.T) {
     w := httptest.NewRecorder()
     request := http.NewRequest(http.MethodGet, "/v1/get_data", nil)
     route.ServeHTTP(w, request)
}

Y el cliente de la API de terceros devolverá datos aleatorios.

En esta situación, ¿qué debo hacer?

Si quiero simular el cliente para obtener datos estables para probar, ¿cómo lo falsifico en la prueba de integración?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular el cliente de API de terceros y obtener datos estables para probar, puedes utilizar un marco de simulación como GoMock o crear una implementación personalizada de la interfaz ApiClient que devuelva los datos de prueba deseados.

    Aquí tienes un ejemplo de cómo usar GoMock para simular la interfaz ApiClient:

    // crear un mock de ApiClient utilizando GoMock
    type mockApiClient struct {
        mock.Mock
    }
    
    func (m *mockApiClient) Do(url string) []byte {
        // devolver los datos de prueba deseados
        return []byte(`{"name": "datos simulados"}`)
    }
    
    // utilizar mockApiClient en una prueba de integración
    func TestGetData(t *testing.T) {
        // crear un cliente simulado
        mockClient := &mockApiClient{}
    
        // inyectar el cliente simulado en el servicio
        repo := NewRepository(orm)
        srv := &DataService{repo: repo}
        res := srv.GetDataFromDB(params, mockClient)
    
        // comprobar que se devuelven los datos de prueba
        assert.Contains(t, string(res[1]), "datos simulados")
    }
    

    De esta manera, puedes controlar los datos devueltos por el cliente simulado y asegurarte de que tu prueba de integración sea estable y predecible.

Comments are closed.