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)