Help us understand the problem. What is going on with this article?

[メモ]fastifyのhttp injection機能

More than 1 year has passed since last update.

http injection

https://github.com/fastify/fastify/blob/master/docs/Testing.md

  • fastifyのinstanceを作成する。
app.js
const app = require('fastify')();

app.get('/users/:id', (req, reply) => {
  reply.send({ id: 2, name: 'piyo' });
});

app.post('/users', (req, reply) => {
  reply
    .code(201)
    .send({ id: 3, name: 'hogehoge' });
});

module.exports = app;
  • http injection機能を利用する際は、injectメソッドを使用する。

  • サーバをlistenすることなく、テスト等を実行できる。

test.js
const test = require('tape');
const app = require('./app');

test.onFinish(() => {
  app.close();
});

test('GET /users/:id', async t => {
  t.plan(3);

  try {
    // 第2引数にNodeスタイルのcallback関数を渡すこともできる。
    // 省略した場合は、Promiseが返却される。
    const res = await app.inject({
      method: 'GET',
      url: '/users/2'
    });

    // tests
    t.equal(res.statusCode, 200);
    t.equal(res.headers['content-type'], 'application/json');
    t.deepEqual(JSON.parse(res.payload), {
      id: 2, 
      name: 'piyo'
    });
  } catch (e) {
    t.fail(e.message);
  }
});

  • リクエストボディを指定したい場合は、payloadプロパティに値を設定する。
test('POST /users', async t => {
  t.plan(4);

  try {
    const res = await app.inject({
      method: 'POST',
      url: '/users',
      payload: { name: 'hogehoge' }
    });
    const payload = JSON.parse(res.payload);

    t.equal(res.statusCode, 201);
    t.equal(res.headers['content-type'], 'application/json');  
    t.equal(payload.name, 'hogehoge');
    t.ok(payload.hasOwnProperty('id'));
  } catch (e) {
    t.fail(e.message);
  }
});
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away