A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Implementando Mocks

21/30
Recursos

Aportes 6

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Para los que se preguntan porque hay tantos 鈥渆rrores鈥 (lo rojo) en el codigo como se ve en esta parte:

Es porque el language server (gopls) no sabe como relacionar main.go y main_test.go porque no hacen parte de un go module. La 鈥渟olucion鈥 mas sencilla es recargar el language server. Si no, solo creen un go module:

$ go mod init testingmod
package main

import "testing"

func TestGetFullTimeEmployeeById(t *testing.T) {
	table := []struct {
		id               int
		dni              string
		mockFunc         func()
		expectedEmployee FullTimeEmployee
	}{
		{
			id:  1,
			dni: "12345678",
			mockFunc: func() {
				GetEmployeeByID = func(id int) (Employee, error) {
					return Employee{
						Id:       1,
						Position: "CEO",
					}, nil
				}

				GetPersonByDNI = func(dni string) (Person, error) {
					return Person{
						Name: "John Doe",
						Age:  35,
						DNI:  "12345678",
					}, nil
				}
			},
			expectedEmployee: FullTimeEmployee{
				Person: Person{
					Age:  35,
					DNI:  "12345678",
					Name: "John Doe",
				},
				Employee: Employee{
					Id:       1,
					Position: "CEO",
				},
			},
		},
	}

	// Save the original functions
	originalGetEmployeeByID := GetEmployeeByID
	originalGetPersonByDNI := GetPersonByDNI

	for _, test := range table {
		// Set the mock functions for the test
		test.mockFunc()

		// Call the function to test
		ft, err := GetFullTimeEmployeeById(test.id, test.dni)
		if err != nil {
			t.Errorf("Error getting full time employee by id: %v", err)
		}

		// Check if the result is the expected
		if ft.Age != test.expectedEmployee.Age {
			t.Errorf("Expected age %v, got %v", test.expectedEmployee.Person.Age, ft.Person.Age)
		}

		if ft.DNI != test.expectedEmployee.DNI {
			t.Errorf("Expected dni %v, got %v", test.expectedEmployee.Person.DNI, ft.Person.DNI)
		}

		if ft.Name != test.expectedEmployee.Name {
			t.Errorf("Expected name %v, got %v", test.expectedEmployee.Person.Name, ft.Person.Name)
		}

		if ft.Employee.Id != test.expectedEmployee.Employee.Id {
			t.Errorf("Expected employee id %v, got %v", test.expectedEmployee.Employee.Id, ft.Employee.Id)
		}

		if ft.Employee.Position != test.expectedEmployee.Employee.Position {
			t.Errorf("Expected employee position %v, got %v", test.expectedEmployee.Employee.Position, ft.Employee.Position)
		}
	}

	// Restore the original functions
	GetEmployeeByID = originalGetEmployeeByID
	GetPersonByDNI = originalGetPersonByDNI
}

Hay una librer铆a llamada Mockery, que te genera los Mocks autom谩ticamente utilizando un comando.

Una vez te genera un mock, es llegar y utilizarlo. Muy f谩cil y practico.
Dejo el proyecto para que le echen una mirada:
https://github.com/vektra/mockery

Tambi茅n se puede hacer uso de

reflect.DeepEqual()

Para comparar objetos sin tener que ir propiedad por propiedad, en este caso quedar铆a as铆 la 煤nica condicional:

if !reflect.DeepEqual(ft, test.expectedEmployee) {
	t.Errorf("Not equal employees, \nExpected: %v\nGot: %v" , ft , test.expectedEmployee)
}

Hola gente, aqu铆 les dejo mis apuntes del Apartado de testing con golang, por si quieren revisarlo jeje
https://plump-flare-484.notion.site/Testing-c945f250509e449d8b9dee247bdc63a6

Se entiende el concepto de poder mockear, reemplazando la implementaci贸n y restaur谩ndola al final. Recomendar铆a evitar este m茅todo, dado que la implementaci贸n se puede reemplazar en un test, como en el programa original.

Adem谩s, el programador se puede olvidar f谩cilmente de hacer alguna restauraci贸n y traiga consecuencias inesperadas en el resultado de las pruebas unitarias.

En otras aportaciones se comentaron herramientas para generar mocks de forma automatizada, esto es una mejor soluci贸n. Agrego que es preferible evitar los mocks y los efectos secundarios cuando sea posible, hace que el comportamiento del c贸digo m谩s predecible.