Simular una dependencia en Go
Depende de una interfaz y la prueba aporta su propia implementación.
type Store interface {
Save(lang string, tpm int) error
}
func Record(store Store, lang string, tpm int) error {
if tpm <= 0 {
return errors.New("tpm must be positive")
}
return store.Save(lang, tpm)
}
type fakeStore struct {
calls []string
err error
}
func (f *fakeStore) Save(lang string, tpm int) error {
f.calls = append(f.calls, fmt.Sprintf("%s=%d", lang, tpm))
return f.err
}
func TestRecord(t *testing.T) {
fake := &fakeStore{}
if err := Record(fake, "go", 104); err != nil {
t.Fatalf("unexpected error: %v", err)
}
if len(fake.calls) != 1 || fake.calls[0] != "go=104" {
t.Errorf("calls = %v", fake.calls)
}
}
Cómo funciona
- El código de producción jamás menciona el fake.
- Una interfaz pequeña es más fácil de simular que una grande.
- Registrar las llamadas en el fake es como asertas sobre ellas.
Palabras clave y builtins usados aquí
appenderrorfuncifintinterfacelenreturnstringstructtype
El intento, en números
- Líneas
- 30
- Caracteres a escribir
- 622
- Tokens
- 176
- Ritmo de tres estrellas
- 105 tpm
Al ritmo de tres estrellas de 105 tokens por minuto, este intento toma unos 101 segundos.
Paso 1 de 3 en Fakes y fixtures; paso 5 de 13 en Pruebas.