2017-06-24 134 views
1

我不明白的测试覆盖率是怎么处理这个.catch()分支:ES6伊斯坦布尔代码覆盖率:如何正确测试分支

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); 
     } 
     }); 

我正确地测试第一块:

如果(e.name === 'ValidationError' & & e.errors.username.kind === '独特'){...)

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

else { /* istanbul ignore next */ 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); 
      }); 
     }); 
     }); 

回答

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%

| %Stmts | %分支| %Funcs | %行|未覆盖的行| - | ---------- | ---------- | ---------- | ---------- | --- ------------- | | 100 | 100 | 100 | 100 | 100 |

+1

你实际上应该测试其他的,不要忽略它。注入一个不是'ValidationError'的错误,看看执行else块是否工作。 – slebetman

+0

是的..我应该..但其他任何错误都会涉及到MongoDB中的save()文件,我不知道如何编写一个测试....任何链接? – erwin

+0

@erwin我遇到了这个SO问题,因为我面对同样的问题'istanbul'报告错误的代码覆盖率。请让我知道你是否找到了解决办法。我同意@slebetman:为了报道你不应该忽视。如果你正在使用'sinon'作为stubbing/spying/mocking,你可以在'examples /'下查看[sinon-mongoose](https://github.com/underscopeio/sinon-mongoose)。这应该给你一些想法来做什么@slebetman推荐 – Vikram

相关问题