如何将调用res.cookie的Express中间件功能进行单位测试



我正在尝试使用摩卡,柴和辛农

基本上,此函数检查req.query上的token参数,如果存在,则添加了一个cookie,其值为token

function tokenRedirect(req, res, next) {
    const qs = require('querystring');
    if (req.query && req.query.token) {
        res.cookie('token', req.query.token);
    } else {
        next();
        return;
    }
    res.redirect('/');
}

我知道我可以做类似的事情:

res = { cookie: sinon.spy() };

,然后

assert(res.cookie.calledWith('token', expectedToken));

,但我想做的是检查 req.cookies实际上有cookie im期望它具有:

assert.equal(req.cookies.token, expectedToken);

问题是resreq及其所有属性都是我为测试创建的模拟,因此res.cookie不是真正将Cookie添加到req对象的实际快速函数。

如何将真实的Express res对象传递给我的功能?甚至可能吗?

我希望我足够清楚,单位测试对我来说是一个新概念。

使用来自Express的实际reqres对象将在集成测试下掉落更多(如果我错了,请更正我(。单位测试仅关注您的代码和所有其他外部依赖项,如果我在评论中我错了,请再次纠正我。

您不必用sion模拟res,而需要部分模拟/实现Express在此处使用的逻辑。所以(使用开玩笑(之类的东西:

const tokenRedirect = require('../location/to/middleware/tokenRedirect')
describe('tokenRedirect', () => {
  /**
   * Mocked Express Request object.
   */
  let req
  /**
   * Mocked Express Response object.
   */
  let res
  /**
   * Mocked Express Next function.
   */
  let next = jest.fn()
  beforeEach(() => {
    req = {
      body: {}
    }
    res = {
      query: {},
      headers: {},
      data: null,
      json(payload) {
        this.data = JSON.stringify(payload)
      },
      cookie(name, value, options) {
          this.headers[name] = value
      }
    }
    next.mockReset()
  })
  test('should correctly set cookie', async () => {
    const expectedToken = 'expected'
    res.query.token = ''
    tokenRedirect(req, res, next)
    expect(res.headers.token).toBeDefined()
    expect(res.headers.token).toEqual(expectedToken)
  })
})

最新更新