測試是開發(fā)應(yīng)用最重要的一部分。Fastify 處理測試非常靈活并且它兼容絕大多數(shù)框架 (例如 Tap。下面的例子都會用這個演示)。
感謝有 light-my-request,F(xiàn)astify 自帶了偽造的 http 注入。
想要注入偽造的 http 請求,使用 inject 方法:
fastify.inject({
method: String,
url: String,
query: Object,
payload: Object,
headers: Object,
cookies: Object
}, (error, response) => {
// 你的測試
})
或是用 promise 的版本
fastify
.inject({
method: String,
url: String,
query: Object,
payload: Object,
headers: Object,
cookies: Object
})
.then(response => {
// 你的測試
})
.catch(err => {
// 處理錯誤
})
Async await 也是支持的!
try {
const res = await fastify.inject({ method: String, url: String, payload: Object, headers: Object })
// 你的測試
} catch (err) {
// 處理錯誤
}
app.js
const Fastify = require('fastify')
function buildFastify () {
const fastify = Fastify()
fastify.get('/', function (request, reply) {
reply.send({ hello: 'world' })
})
return fastify
}
module.exports = buildFastify
test.js
const tap = require('tap')
const buildFastify = require('./app')
tap.test('GET `/` route', t => {
t.plan(4)
const fastify = buildFastify()
// 在測試的最后,我們強(qiáng)烈建議你調(diào)用 `.close()`
// 方法來確保所有與外部服務(wù)的連接被關(guān)閉。
t.tearDown(() => fastify.close())
fastify.inject({
method: 'GET',
url: '/'
}, (err, response) => {
t.error(err)
t.strictEqual(response.statusCode, 200)
t.strictEqual(response.headers['content-type'], 'application/json; charset=utf-8')
t.deepEqual(response.json(), { hello: 'world' })
})
})
你還可以在 fastify.listen() 啟動服務(wù)器之后,或是 fastify.ready() 初始化路由與插件之后,進(jìn)行 Fastify 的測試。
使用之前例子的 app.js。
test-listen.js (用 Request 測試)
const tap = require('tap')
const request = require('request')
const buildFastify = require('./app')
tap.test('GET `/` route', t => {
t.plan(5)
const fastify = buildFastify()
t.tearDown(() => fastify.close())
fastify.listen(0, (err) => {
t.error(err)
request({
method: 'GET',
url: 'http://localhost:' + fastify.server.address().port
}, (err, response, body) => {
t.error(err)
t.strictEqual(response.statusCode, 200)
t.strictEqual(response.headers['content-type'], 'application/json; charset=utf-8')
t.deepEqual(JSON.parse(body), { hello: 'world' })
})
})
})
test-ready.js (用 SuperTest 測試)
const tap = require('tap')
const supertest = require('supertest')
const buildFastify = require('./app')
tap.test('GET `/` route', async (t) => {
const fastify = buildFastify()
t.tearDown(() => fastify.close())
await fastify.ready()
const response = await supertest(fastify.server)
.get('/')
.expect(200)
.expect('Content-Type', 'application/json; charset=utf-8')
t.deepEqual(response.body, { hello: 'world' })
})
現(xiàn)在你便可以在編輯器中檢測你的測試文件 (以及 fastify 的其他部分) 了。
更多建議: