Fastify 測試

2020-02-06 15:43 更新

測試

測試是開發(fā)應(yīng)用最重要的一部分。Fastify 處理測試非常靈活并且它兼容絕大多數(shù)框架 (例如 Tap。下面的例子都會用這個演示)。

帶有 http 注入的測試

感謝有 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' })
  })
})

測試正在運(yùn)行的服務(wù)器

你還可以在 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' })
})

如何檢測 tap 的測試

  1. 設(shè)置 {only: true} 選項(xiàng),將需要檢測的測試與其他測試分離test('should ...', {only: true}, t => ...)
  2. 通過 npx 運(yùn)行 tap> npx tap -O -T --node-arg=--inspect-brk test/<test-file.test.js>
  • -O 表示開啟 only 選項(xiàng),只運(yùn)行設(shè)置了 {only: true} 的測試
  • -T 表示不設(shè)置超時
  • --node-arg=--inspect-brk 會啟動 node 調(diào)試工具
  1. 在 VS Code 中創(chuàng)建并運(yùn)行一個 Node.js: Attach 調(diào)試配置,不需要額外修改。

現(xiàn)在你便可以在編輯器中檢測你的測試文件 (以及 fastify 的其他部分) 了。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號