1

我不明白测试覆盖率如何处理这个 .catch() 分支:

  newUser.save()
    .then((savedUser) => {
      res.json(savedUser);
    })
    .catch(
      (e) => {
        if (e.name === 'ValidationError' && e.errors.username.kind === 'unique') {
          res.status(409);
          res.json({ error: { message: 'Existing user', field: e.errors.username.path, value: e.errors.username.value } });
        } else {
          /* istanbul ignore next */
          next(e);
        }
      });

我正在正确测试第一个块:

if (e.name === 'ValidationError' && e.errors.username.kind === 'unique') {...)

而且我没有测试第二个 else 块,所以我添加了一个忽略下一条语句:

else { /* 伊斯坦布尔忽略下一个 */ next(e); }

代码代码覆盖率报告第 58 行。(如果..)未覆盖..

 |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
-|----------|----------|----------|----------|----------------|
 |      100 |    93.75 |      100 |      100 |             58 |

但是以下测试正在正确执行,涵盖了这一行......

      describe('# POST /api/v1/users', () => {
        it('should NOT create a duplicated user', () => {
          return request(app)
            .post('/api/v1/users')
            .set('Authorization', superAdminJwtToken)
            .send(newUser)
            .expect(httpStatus.CONFLICT)
            .then((res) => {
              expect(res.body.error.message).to.equal('Existing user');
              expect(res.body.error.field).to.equal('username');
              expect(res.body.error.value).to.equal(newUser.username);
            });
        });
      });
4

1 回答 1

0

解决方案是插入一个

/* istanbul ignore else */

如下

.catch(
  (e) => {
    /* istanbul ignore else */
    if (e.name === 'ValidationError' && e.errors.username.kind === 'unique') {
      res.status(409);
      res.json({ error: { message: 'Existing user', field: e.errors.username.path, value: e.errors.username.value } });
    } else {
      next(e);
    }
  })

那么代码覆盖率输出为 100%

| % 语句 | % 分支 | % 功能 | % 线 |未覆盖线 | -|----------|---------|----------|---------|---- ------------| | 100 | 100 | 100 | 100 | 100 |

于 2017-06-24T17:39:17.143 回答