Testes HTTP
Neste guia, aprendemos como escrever testes HTTP em um servidor de API.
Se você é novo em testes com AdonisJs, ou apenas testes em geral, considere ler o guia link:testing[Getting Started] antes de continuar.
Exemplo básico
Vamos começar com um exemplo básico para testar um ponto de extremidade HTTP que retorna uma lista de postagens no formato JSON.
OBSERVAÇÃO
O exemplo a seguir pressupõe que você criou um modelo Post
com tabela de banco de dados relacionada e definiu uma rota GET /posts
que retorna todos os modelos Post
.
Primeiro, faça um novo teste funcional (já que testaremos a API como um usuário final):
adonis make:test Post
# .make:test Menu
> Select the type of test to create
Unit test
❯ Functional test
# Output
create: test/functional/post.spec.js
Em seguida, abra o arquivo de teste e cole o seguinte código:
// .test/functional/post.spec.js
const { test, trait } = use('Test/Suite')('Post')
const Post = use('App/Models/Post')
trait('Test/ApiClient')
test('get list of posts', async ({ client }) => {
await Post.create({
title: 'Adonis 101',
body: 'Blog post content'
})
const response = await client.get('/posts').end()
response.assertStatus(200)
response.assertJSONSubset([{
title: 'Adonis 101',
body: 'Blog post content'
}])
})
Examinando nosso arquivo de teste...
- Registramos o traço
Test/ApiClient
, fornecendo umcliente
HTTP para fazer solicitações - Criamos uma instância fictícia
Post
- Solicitamos a URL
/posts
e capturamos a resposta - Executamos asserções na resposta para garantir que o status HTTP seja
200
e pelo menos um post retornado tenha o mesmo title
e body
que nossa instância fictícia Post
Finalmente, execute todos os seus testes funcionais por meio do seguinte comando:
adonis test functional
# Output
Post
✓ get list of posts (286ms)
PASSED
total : 1
passed : 1
time : 289ms
Seu primeiro teste HTTP PASSOU. Parabéns! 🎉
Métodos do cliente
Os métodos a seguir podem ser chamados ao fazer solicitações HTTP.
get(url)
Faça uma solicitação HTTP GET
para uma URL fornecida:
client.get('posts')
DICA
Os métodos post
, patch
, put
, delete
e head
também podem ser usados para fazer solicitações HTTP.
header(key, value)
Defina um par de cabeçalho chave/valor
ao fazer a solicitação HTTP:
client
.get('posts')
.header('accept', 'application/json')
send(body)
Envie o corpo da solicitação ao fazer a solicitação HTTP:
client
.post('posts')
.send({
title: 'Adonis 101',
body: 'Post content'
})
query(queryObject)
Defina os parâmetros da string de consulta:
client
.get('posts')
.query({ order: 'desc', page: 1 }) // ?order=desc&page=1
type(type)
Defina o tipo de conteúdo da solicitação:
client
.get('posts')
.type('json')
accept(type)
Defina o tipo de dados que você deseja aceitar do servidor:
client
.get('posts')
.accept('json')
cookie(key, value)
Defina os cookies da solicitação:
client
.get('posts')
.cookie('name', 'virk')
OBSERVAÇÃO
Como todos os cookies são criptografados no AdonisJs, esse método garante a criptografia adequada dos valores para que o servidor AdonisJs possa analisá-los.
plainCookie(key, value)
Defina um cookie que não seja criptografado:
client
.get('posts')
.plainCookie('name', 'virk')
end
Finalize a cadeia de solicitações HTTP, execute a solicitação e retorne a resposta:
const response = await client.get('posts').end()
OBSERVAÇÃO
Você deve chamar end
para executar solicitações HTTP client
.
Solicitações multipartes
Para fazer solicitações multipartes e enviar arquivos com o corpo da solicitação:
await client
.post('posts')
.field('title', 'Adonis 101')
.attach('cover_image', Helpers.tmpPath('cover-image.jpg'))
.end()
Você também pode definir nomes de campo de estilo de formulário HTML para enviar uma matriz de dados:
await client
.post('user')
.field('user[name]', 'Virk')
.field('user[email]', 'virk@adonisjs.com')
.end()
Sessões
Ao escrever testes, você pode querer definir sessões de antemão.
Isso pode ser feito usando o trait Session/Client
:
const { test, trait } = use('Test/Suite')('Post')
trait('Test/ApiClient')
trait('Session/Client')
test('get list of posts', async ({ client }) => {
const response = await client
.get('posts')
.session('adonis-auth', 1)
.end()
})
OBSERVAÇÃO
O AdonisJs Session Provider deve ser instalado antes que você possa aproveitar o trait Session/Client
.
Autenticação
Você pode autenticar usuários antecipadamente usando o trait Auth/Client
:
const { test, trait } = use('Test/Suite')('Post')
trait('Test/ApiClient')
trait('Auth/Client')
trait('Session/Client')
test('get list of posts', async ({ client }) => {
const user = await User.find(1)
const response = await client
.get('posts')
.loginVia(user)
.end()
})
Para autenticar com um esquema personalizado:
client
.get('posts')
.loginVia(user, 'jwt')
Para autenticação básica, passe o username
e a password
do usuário:
client
.get('posts')
.loginVia(username, password, 'basic')
Assertions
As seguintes asserções podem ser chamadas em respostas HTTP client
.
assertStatus
Afirme o status da resposta:
response.assertStatus(200)
assertJSON
Afirme que o corpo da resposta deve deepEqual
o valor esperado:
response.assertJSON({
})
assertJSONSubset
Afirme um subconjunto de JSON:
response.assertJSONSubset({
title: 'Adonis 101',
body: 'Some content'
})
DICA
Esta afirmação testa um subconjunto de objetos, o que é útil quando os valores dentro de um objeto não são determináveis (por exemplo, carimbos de data/hora).
assertText
Declara o texto simples retornado pelo servidor:
response.assertText('Hello world')
assertError
Declara o erro de resposta:
response.assertError([
{
message: 'username is required',
field: 'username',
validation: 'required'
}
])
assertCookie
Declara que o servidor definiu um cookie com o valor:
response.assertCookie('key', 'value')
assertPlainCookie
Declara um valor de cookie simples:
response.assertPlainCookie('key', 'value')
assertCookieExists
Declara que o servidor definiu um cookie com o nome fornecido:
response.assertCookieExists('key')
assertPlainCookieExists
Declara que existe um cookie simples:
response.assertPlainCookieExists('key')
assertHeader
Afirma que o servidor enviou um cabeçalho:
response.assertHeader('content-type', 'application/json')
assertRedirect
Afirma que a solicitação foi redirecionada para uma URL fornecida:
response.assertRedirect('/there')