Exportando a função
Pra começar precisamos definir as funções que queremos exportar como publicas, o GO considera funções publicas todas as funções que começam com a letra maiúscula, e considera como privada todas as funções que começam com a letra minúscula
Criando o teste
No GO é convencionado que todos os arquivos de teste terminem com _test
além disso o GO não precisa de uma lib externa como por exemplo jest
no javascript para fazer os testes, ele já vem com a ferramenta de testes por padrão. Porem para facilitar na hora de fazer as comparações de resultados precisamos instalar a lib testify
com o seguinte comando
go get github.com/stretchr/testify/require
para o caso do teste vamos testar a função Enable que pertence a struct
Product
type Product struct { ID string Name string Price float64 Status string } func (p *Product) Enable() error { if p.Price > 0 { p.Status = ENABLED return nil } return errors.New("Price must be greater than 0") }
A struct no go funciona semelhante a uma classe em linguagens orientadas a objetos, onde declaramos a struct com todos as valores que ela precisa, e associamos metodos a ela
E para criar o teste em sí vamos criar o arquivo product_test.go
onde o package dele vai ser o mesmo package do arquivo original mas com um test no final e ai vamos declarar a função como
`Test{nome da Struct}{nome do Metodo} (t *testing.T)`
func TestProduct_Enable(t *testing.T) { product := application.Product{} product.Name = "Hello" product.Status = application.DISABLED product.Price = 10 err := product.Enable() require.Nil(t, err) product.Price = 0 err = product.Enable() require.Equal(t, "Price must be greater than 0", err.Error()) }
o primeiro require queremos garantir que não deu erro e no segundo queremos ver se deu erro. Podemos fazer ambos os testes na mesma função
Bonus: Validando campos
Nesse mesmo projeto utilizei a lib asaskevich/govalidator
para validar se os campos estão vindo como eu espero no Product.
utilizei essa lib da seguinte forma
go get github.com/asaskevich/govalidator
func init() { govalidator.SetFieldsRequiredByDefault(true) }
e na Struct onde defino os campos de Product ao lado coloquei as tags
type Product struct { ID string `valid:"uuidv4"` Name string `valid:"required"` Price float64 `valid:"float,optional"` Status string `valid:"required"` }
para validar se o id é uuidv4 se veio o nome e o status e se o preço é float
Top comments (0)