9
respostas

Teste de retorno em JSON não funciona

Eu criei alguns testes a mais como o de retornar HTML e o de retornar em JSON. O retorno de HTML consegui fazer normalmente, porém o retorno em JSON ele mostra a seguinte mensagem:

  1) #ProdutosController
       #Cadastro de Produtos com retorno em JSON:
     Error: expected "Accept" header field
      at Test._assertHeader (node_modules\supertest\lib\test.js:237:45)
      at Test._assertFunction (node_modules\supertest\lib\test.js:283:11)
      at Test.assert (node_modules\supertest\lib\test.js:173:18)
      at Server.localAssert (node_modules\supertest\lib\test.js:131:12)
      at emitCloseNT (net.js:1664:8)
      at _combinedTickCallback (internal/process/next_tick.js:136:11)
      at process._tickCallback (internal/process/next_tick.js:181:9)

#Teste retorno JSON

    it("#Cadastro de Produtos com retorno em JSON", done => {
        request.post("/produtos")
            .send({ titulo: "Livro Nodee.JS", descricao: "Novo Livro", preco: "20.40" })
            .set("Accept", "application/json")
            .set("Content-Type", "application/json")
            .expect("Accept", /json/)
            .expect(302, done);
    });

O erro exibido não é muito sugestivo... Alguém pode me ajudar?

9 respostas

Oi Leonardo, tudo bem? O teste deveria testar o cabeçalho de resposta que é o Content-Type, e não o de requisição que é o Accept.

Você não precisa desse set:

.set("Content-Type", "application/json")

E o expect deveria ser esse:

.expect("Content-Type", /json/)

Então Wanderson, acabei de ver que o teste que eu estou fazendo, a aplicação não tem por que devolver um JSON após o POST. Não sei onde estava com a cabeça hahaha.

E por qual motivo não preciso colocar o Header Content-Type = application/json? Por que ele já manda nesse formato?

E esse Content-Type = /json/ é o tipo de retorno do Response?

Ah não, tá certo, eu que comi bola aqui. Me parece sim que você precisa enviar o content-type e o accept dessa forma sim. Devo ter confundido algo.

E acho que deixei passar que era um post, que não devolve resposta e por isso o teste falha, no máximo ele devolve o 302, certo?

Verdade, o POST não devolve nenhuma informação. Mas queria entender uma coisa... Esse expect ele vai verificar os headers do response? Ou do request que foi feito? E uma dúvida, o POST não me retornaria no headers um Content-type? Por que eu gostaria de testar se o response é um application/json entende? Ainda estou um pouco perdido.

É pra ser do response, não vejo muito sentido em testar o request em si, já que a intenção do teste é verificar se a api tá respondendo como esperado.

Sim, o response tem um content-type e é nela que você verifica se a resposta é um json.

Faz sentido?

Faz sentido sim... Bom... eu vou reescrever o teste então e se funcionar com o content-type sendo application/json eu marco como solucionado :D

Ótimo, fico no aguardo!

Wanderson, desculpa a demora... estávamos de mudança aqui na empresa e só consegui tempo hoje.

Eu fiz uma mudança no teste:

    it("#Cadastro de Produtos enviando JSON", done => {
        request.post("/produtos")
            .send({ titulo: "Livro Nodee.JS", descricao: "Novo Livro", preco: "20.40" })
            .set("Accept", "application/json")
            .set("Content-Type", "application/json")
            .expect("Content-Type", /json/)
            .expect(302, done);
    });

porém, esse me retorna esse erro: 1) #ProdutosController

   #Cadastro de Produtos enviando JSON:
 Error: expected "Content-Type" header field
  at Test._assertHeader (node_modules\supertest\lib\test.js:237:45)
  at Test._assertFunction (node_modules\supertest\lib\test.js:283:11)
  at Test.assert (node_modules\supertest\lib\test.js:173:18)
  at Server.localAssert (node_modules\supertest\lib\test.js:131:12)
  at emitCloseNT (net.js:1664:8)
  at _combinedTickCallback (internal/process/next_tick.js:136:11)
  at process._tickCallback (internal/process/next_tick.js:181:9)</code>

Eu quero testar se enviando um JSON, eu tenho um retorno do produto em JSON. Acho que o teste que foi escrito faz sentido não?

Faz sentido pra mim sim. O que me parece estranho é que você não está recebendo o content-type de volta.