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.jsEm 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 umclienteHTTP para fazer solicitações - Criamos uma instância fictícia
Post - Solicitamos a URL
/postse 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 : 289msSeu 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=1type(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')