【问题标题】:How to test `verify` of an express middleware in Jest如何在 Jest 中测试快速中间件的“验证”
【发布时间】:2022-02-11 10:35:12
【问题描述】:

我有一个返回中间件的函数:

const jsonParser = () => {
  return express.json({
    limit: '5mb',
    verify: (req, res, buf) => {
      // If the incoming request is a stripe event,
      if (req.headers['some-header']) {
        httpContext.set('raw-body', buf.toString());
      }
    },
  });
};

我想测试当some-header 标头存在时,httpContext.set 确实被调用了。

我的测试:

describe('jsonParser middleware', () => {
  it('sets the http context', async () => {
    const req = {
      headers: {
        'some-header': 'some-sig',
        'content-type': 'application/json',
      },
      body: JSON.stringify({
        some: 'thing',
      }),
    };

    const res = {};
    const middleware = jsonParser();

    middleware(req, res, () => {});

    expect(httpContext.set).toHaveBeenCalled();
  });
});

我不知道如何让测试运行传递给verify 的函数。 Express 文档声明内容类型应该是 json,但仅此而已。任何能指出我正确方向的人都将受到高度赞赏。

谢谢。

【问题讨论】:

  • 我不会在单元级别测试它(正如你所看到的,你最终会测试你不拥有接口的 Express 对象的替身),例如使用SuperTest 以 integration 测试使用该标头的端点是否正确运行。
  • @jonrsharpe 这是一个公平的观点。我们目前缺乏集成测试,这是我们高层需要它的另一个很好的例子。感谢您的回复。

标签: express jestjs


【解决方案1】:

如 cmets 中所述,我想为您提供一个集成测试示例,该示例测试标头和 jsonwebtoken。我也在使用 express 框架,但我用 JS 编写了代码。

这是在我建立的论坛中创建论坛帖子的测试。中间件正在检查用户的令牌,因此这种情况可能与您的情况类似。

const request = require('supertest');

test('create authorized 201', async () => {
  const forumCountBefore = await ForumPost.countDocuments();
  const response = await request(app)
    .post('/api/forumPosts')
    .set({
      Authorization: `Bearer ${forumUserOne.tokens[0].token}`,
      userData: {
        userId: forumUserOneId,
        email: 'forum@controller.com',
        username: 'forum',
      },
    })
    .send(forumPost)
    .expect(201);
  expect(response.body.message).toBe('created forumPost');

  const forumCountAfter = await ForumPost.countDocuments();
  expect(forumCountBefore + 1).toBe(forumCountAfter);
});

我正在使用 mongoDB,这就是为什么我使用 ForumPost.countDocuments 来计算数据库中的条目数量。

正如您在测试中看到的,我使用 supertest(作为请求导入)发送 http 调用。在设置块中,我设置了授权令牌。这会导致中间件在集成测试中执行。

只有当中间件的代码被正确执行时测试才能通过,所以它应该覆盖你的中间件的代码。

【讨论】:

  • 我认为你是绝对正确的。为此编写更多的集成类型测试很有意义。我不确定为什么我如此专注于为它编写单元测试。感谢您为我指明正确的方向。我最终做的是在我的中间件中修改 res.locals。在使用 supertest 的请求后检查 res.locals 是否包含我想要的属性非常简单。再次感谢。
  • 很高兴我能帮上忙 :)
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 2020-09-18
  • 2019-10-02
  • 2014-06-20
  • 2019-05-23
相关资源
最近更新 更多