HTTP 测试
AdonisJS 附带 Japa API 客户端 插件。您可以使用它来测试您的应用程序 HTTP 站点。
API 客户端的主要用例是测试 JSON 响应。但是,其他响应类型 (例如 HTML,甚至纯文本) 没有技术限制。
使用 API 客户端执行由外向内测试的测试应该是 functional
测试套件的一部分。
node ace make:test functional users/list
# CREATE: tests/functional/users/list.spec.ts
// title: tests/functional/users/list.spec.ts
import { test } from '@japa/runner'
test.group('List users', () => {
test('get a paginated list of users', async ({ client }) => {
const response = await client.get('/users')
console.log(response.body())
})
})
注:请阅读 Japa 文档 以查看所有可用的方法和断言。本指南仅记录 AdonisJS 添加的附加方法
开放 API 测试#
API 客户端允许您针对您的 OpenAPI 规范编写断言。
将规范 YAML 或 JSON 文件保存在项目根目录中,并将其注册到 tests/boostrap.ts
文件中。
// title: tests/bootstrap.ts
export const plugins: Config['plugins'] = [
// highlight-start
assert({
openApi: {
schemas: [Application.makePath('api-spec.yml')],
},
}),
// highlight-end
runFailedTests(),
apiClient(),
]
注册模式后,您可以使用 response.assertAgainstApiSpec
方法对 API 规范进行断言。
test('get a paginated list of existing posts', async ({ client }) => {
const response = await client.get('/posts')
response.assertAgainstApiSpec()
})
- 断言将使用 request method、endpoint 和 response status code 来查找预期的响应模式。
- 根据匹配模式验证实际响应正文。
请注意,仅测试响应的形状,而不是实际值。因此,你可能必须编写额外的断言。例如:
// 断言响应符合模式
response.assertAgainstApiSpec()
// 断言期望值
response.assertBodyContains({
data: [{ title: 'Adonis 101' }, { title: 'Lucid 101' }]
})
Cookie#
你可以在请求期间读取 / 写入 cookie。 cookie 在请求期间自动签名,并在响应中转换为纯文本。
在以下示例中,user_preferences
cookie 被发送到服务器。
await client
.get('/users')
.cookie('user_preferences', { limit: 10 })
你还可以使用 response.cookies()
方法读取服务器设置的 cookie。
const response = await client.get('/users')
console.log(response.cookies())
console.log(response.cookie('user_preferences'))
response.assertCookie('user_preferences')
加密 cookies#
默认情况下,cookie 在请求期间是签名和未签名的。你可以使用 encryptedCookie
方法将加密的 cookie 发送到服务器。
await client
.client('/users')
.encryptedCookie('user_preferences', { limit: 10 })
编码 cookies#
你还可以使用 plainCookie
方法将纯 cookie (base64 编码) 发送到服务器。
await client
.client('/users')
.plainCookie('user_preferences', { limit: 10 })
Session#
@adonisjs/session
包通过在请求期间提供额外的方法来读取 / 写入会话数据来扩展 API 客户端。
Session 在测试期间必须使用 memory
驱动程序。因此,请确保更新 .env.test
文件中的 SESSION_DRIVER
。
// 文件名: .env.test
SESSION_DRIVER=memory
写入 session 值#
你可以使用 session
方法在请求期间设置会话数据。服务器可以访问会话值。
await client.get('/').session({ user_id: 1 })
此外,你可以使用 flashMessages
方法设置 Flash 消息。
await client.get('/').flashMessages({
errors: {
title: ['Post title is required']
}
})
读取会话值#
你可以使用响应对象上的 session
方法读取服务器设置的会话数据。
const response = await client.get('/')
console.log(response.session())
可以使用 flashMessages
方法访问 flash 消息。
const response = await client.get('/')
console.log(response.flashMessages())
你可以使用 dumpSession
方法将会话数据转储到控制台。
const response = await client.get('/')
// 写入控制台
response.dumpSession()
验证#
@adonisjs/auth
包扩展了 API 客户端并添加了 loginAs
方法,你可以在发出请求时以特定用户身份登录。
该方法接受要登录的用户对象的实例。
const user = await User.find(1)
await client.get('/posts').loginAs(user)
你还可以指定在对用户进行身份验证时使用的身份验证保护。 Web 守卫将创建会话,而 API 令牌守卫将生成一个令牌并将其设置为请求头。
const user = await User.find(1)
await client.get('/posts')
.guard('api')
.loginAs(user)
对于基本身份验证,你可以使用 basicAuth
方法。它接受用户登录凭据作为参数。确保将纯密码 (未经过哈希处理) 传递给 basicAuth
方法。
await client.get('/posts').basicAuth('email', 'password')
文件上传#
AdonisJS 在处理文件上传时提供了很好的测试体验。你可以生成内存中的虚拟文件并伪造 Drive 实现,以便在测试期间不保留任何文件。
假设您想测试用户是否可以使用特定大小的有效图像文件更新他们的头像。现在,你可以使用 AdonisJS file
助手来生成内存中的图像,而不是在项目中保留不同大小的图像。
同样,不是将用户上传的文件存储在磁盘或 s3 (一种云存储服务)上。你可以调用 Drive.fake()
方法在内存中收集用户上传的文件并针对它们编写断言。
让我们看看这一切在实践中是如何运作的。
import { test } from '@japa/runner'
import Drive from '@ioc:Adonis/Core/Drive'
import { file } from '@ioc:Adonis/Core/Helpers'
test('a user can update avatar', async ({ client, assert }) => {
/**
* 在此之后使用 Drive 的服务器代码
* 不会在磁盘上写入任何文件
*/
const fakeDrive = Drive.fake()
/**
* 创建一个假文件上传
*/
const fakeAvatar = await file.generatePng('1mb')
await client
.put(`/me`)
.loginAs(user)
.file('avatar', fakeAvatar.contents, { filename: fakeAvatar.name })
/**
* 断言文件上传成功
*/
assert.isTrue(await fakeDrive.exists(fakeAvatar.name))
/**
* 恢复 Drive fake
*/
Drive.restore()
})
附加断言#
你可以使用 response
对象上可用的断言来验证服务器响应。
Additional assertions#
AdonisJS 在现有的 Japa 断言 之上提供了以下附加方法。
assertSession#
断言给定的会话存在。或者,你还可以断言会话值。
response.assertSession('foo')
/**
* 提供值时两个断言在后台执行
*/
response.assertSession('foo', 'bar')
assertSessionMissing#
断言响应中不存在会话。
response.assertSessionMissing('foo')
assertFlashMessage#
断言给定的 flash 消息存在。或者,你还可以断言特定值。
response.assertFlashMessage('errors')
/**
* 提供值时两个断言在后台执行
*/
response.assertFlashMessage('errors', [
{
title: ['Post title is required']
}
])
assertFlashMissing#
断言响应中不存在 flash 消息。
response.assertFlashMissing('success')
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。