vercel / micro

Asynchronous HTTP microservices

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Test in the readme doesn't work

kennetpostigo opened this issue · comments

The tests in the readme section "Testing" doesn't seem to work

const http = require('http')
const micro = require('micro')
const test = require('ava')
const listen = require('test-listen')
const request = require('request-promise')

test('my endpoint', async t => {
  const service = new http.Server(micro(async (req, res) => {
    micro.send(res, 200, {
      test: 'woot'
    })
  }))

  const url = await listen(service)
  const body = await request(url)

  t.deepEqual(JSON.parse(body).test, 'woot')
  service.close()
})

Is this still the recommended approach?

Commenting to echo that I have this issue.

When I invoke the function with micro in my test, ava hangs.
My function code that am testing

module.exports = (req, res) => {
  let who = "anonymous";

  if (req.body && req.query && req.query.who) {
    who = req.query.who;
  } else if (req.query && req.query.who) {
    who = req.query.who;
  } else if (req.cookies && req.cookies.who) {
    who = req.cookies.who;
  }

    res.send(res, 200, `Hello ${who}!`)
};

My test looks like the following

const test = require('ava');
const index = require('../api/index');
const micro = require("micro");
const http = require('http')
const listen = require('test-listen')
const request = require('request-promise')

test('my endpoint', async t => {
  const service = new http.Server(micro(index));

  const url = await listen(service)
  const body = await request(url)

  t.deepEqual(body, 'Hello anonymous!')
  service.close()
})

Now using res.write and res.end instead of res.send to illustrate that not using micro this works:

module.exports = (req, res) => {
  let who = "anonymous";

  if (req.body && req.query && req.query.who) {
    who = req.query.who;
  } else if (req.query && req.query.who) {
    who = req.query.who;
  } else if (req.cookies && req.cookies.who) {
    who = req.cookies.who;
  }

  res.write(`Hello ${who}!`);
  res.end();
};

Now testing a plain https.Server without using micro will pass my test

const test = require('ava');
const index = require('../api/index');
const micro = require("micro");
const http = require('http')
const listen = require('test-listen')
const request = require('request-promise')

test('my endpoint', async t => {
  const service = new http.Server(index);

  const url = await listen(service)
  const body = await request(url)

  t.deepEqual(body, 'Hello anonymous!')
  service.close()
})

I had the same issue and resolved it be removing the unnecessary(?) use of http.Server in the test. Im not sure if the micro code has been updated since that example test was written, or even if this is a valid solution - but it seems to work.

const micro = require('micro')
const listen = require('test-listen')
const request = require('request-promise')

test('route', async () => {
  const service = micro(async (req, res) => {
    micro.send(res, 200, {
      recieved: true
    })
  })
  const url = await listen(service)
  const body = await request(url)

  expect(JSON.parse(body).recieved).toEqual(true)
  service.close()
})

Moved the note about the readme being for the canary version: ceaf102