2017-06-24 1 views
1

Je ne comprends pas comment la couverture de test est le traitement de cette .catch() branche:ES6 couverture de code Istanbul: comment tester correctement une branche

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

Je teste correctement le premier bloc:

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

et je n'ai pas un test pour le second bloc d'autre , donc j'ai ajouté une déclaration suivante ignorer:

autre { /* istanbul ignorer suivant */ suivant (e); }

la couverture code signale la ligne 58. (si ..) non couverte ..

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

mais le test suivant est en cours d'exécution correctement, couvrant cette ligne ...

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

Répondre

0

la solution consiste à insérer un

/* istanbul ignore else */ 

comme suit

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

alors la sortie de couverture de code est 100%

| % Stmts | % Direction | % Funcs | % Lignes | Lignes non couvertes | - | ---------- | ---------- | ---------- | ---------- | --- ------------- | | 100 | 100 | 100 | 100 | 100 |

+1

Vous devriez tester l'autre, ne l'ignorez pas. Injecter une erreur qui n'est pas 'ValidationError' et voir si l'exécution du bloc else fonctionne. – slebetman

+0

oui .. Je devrais .. mais toute autre erreur serait liée à un document save() dans MongoDB et je ne sais pas quoi et comment écrire un test pour cela .... un lien? – erwin

+0

@erwin Je suis tombé sur cette question SO car je fais face au même problème de couverture de code incorrect rapporté par 'istanbul'. S'il vous plaît laissez-moi savoir si vous avez trouvé une solution. Je suis d'accord avec @slebetman: vous ne devriez pas ignorer pour des raisons de couverture. Si vous utilisez 'sinon' pour stubbing/spying/moquerie, vous pouvez regarder [sinon-mongoose] (https://github.com/underscopeio/sinon-mongoose) sous' examples/'. Cela devrait vous donner une idée de ce que recommande @slebetman – Vikram