Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste de Update do Aluno está falhando

Não consigo compreender onde está o problema, mas meu teste de atualização de aluno está falhando.

Do que consegui apurar, ao fazer o c.ShouldBind para atualizar os valores do aluno, ele não está conseguindo buscar os dados corretamente do request e o aluno está ficando com dados vazios (e, por isso, não passa pela validação). Quando realizo o request normalmente pelo Postman, a atualização funciona. Acredito que o problema seja como o request está sendo formatado para ser enviado, porém, não consigo debugar isso, alguém enfrentou problema parecido?

Segue abaixo meu código:

func AtualizaAluno(c *gin.Context) {
    var aluno models.Aluno
    id := c.Params.ByName("id")
    database.DB.First(&aluno, id)
    if aluno.ID == 0 {
        c.JSON(http.StatusNotFound, gin.H{
            "error": "Aluno não encontrado",
        })
        return
    }
    if err := c.ShouldBind(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }
    if err := models.ValidaDadosDeAluno(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error()})
        return
    }
    database.DB.Model(&aluno).UpdateColumns(aluno)
    c.JSON(http.StatusOK, aluno)

}



func TestAtualizaAlunoPorIDHandler(t *testing.T){
    database.ConectaComBancoDeDados()
    CriaAlunoMock()
    defer DeletaAlunoMock()
    r := SetupDasRotasDeTeste()
    r.PATCH("/alunos/:id", controllers.AtualizaAluno)
    aluno := models.Aluno{Nome:"Aluno Teste", CPF:"47123456789", RG:"123456700"}
    body, _ := json.Marshal(aluno)
    path := "/alunos/" + strconv.Itoa(ID)
    req, _ := http.NewRequest("PATCH", path, bytes.NewBuffer(body))
    resposta := httptest.NewRecorder()
    r.ServeHTTP(resposta, req)
    assert.Equal(t,http.StatusOK, resposta.Code)
    var alunoMock models.Aluno
    json.Unmarshal(resposta.Body.Bytes(), &alunoMock)
    assert.Equal(t, "Aluno Teste", alunoMock.Nome)
    assert.Equal(t, "74345678912", alunoMock.CPF)
    assert.Equal(t, "123456700", alunoMock.RG)
}

Resultado dos testes:

[GIN] 2023/07/24 - 15:06:00 | 200 |     95.7475ms |                 | PATCH    "/alunos/45"
--- FAIL: TestAtualizaAlunoPorIDHandler (0.52s)
    main_test.go:84:
                Error Trace:    G:/projetos/Go/Alura/gin/main_test.go:84
                Error:          Not equal:
                                expected: "74345678912"
                                actual  : "12345678912"
                                Diff:
                                --- Expected
                                +++ Actual
                                @@ -1 +1 @@
                                -74345678912
                                +12345678912
                Test:           TestAtualizaAlunoPorIDHandler
    main_test.go:85:
                Error Trace:    G:/projetos/Go/Alura/gin/main_test.go:85
                Error:          Not equal:
                                expected: "123456700"
                                actual  : "123456789"
                                Diff:
                                --- Expected
                                +++ Actual
                                @@ -1 +1 @@
                                -123456700
                                +123456789
                Test:           TestAtualizaAlunoPorIDHandler
FAIL
1 resposta
solução!

Realizando mais testes, acabei de perceber que a função correta é ShouldBindJSON, e não ShouldBind. Corrigindo a função, o teste passou.