web-dev-qa-db-fra.com

Imprimer le message sur attend () assert échec

Existe-t-il un moyen d’imprimer un message d’erreur personnalisé en cas d’échec de Jasmine expect()?

Par exemple, pour les tests de bout en bout, j'ai un tableau de pages Web et j'utilise un test pour accéder à chaque URL et affirmer qu'un élément existe sur chaque page. Je sais que je peux mettre chaque expect() dans un test séparé, mais je préfère parcourir le tableau et enregistrer l'URL de la page en cas d'échec. 

44
user3517049

METTRE À JOUR

Je vois que les gens trouvent encore cela. Les informations ultérieures de l'équipe Jasmine indiquent qu'il existe une fonctionnalité non documentée sur l'attente. Vous pouvez inclure un message d'échec personnalisé et cela fonctionne:

expect( fields[i].element.exists() ).toEqual(true, field[i].name + ' is expected to exist');

Ce qui est exactement ce que je cherchais à l'origine.

La réponse originale suit:

Je cherchais exactement cela aujourd'hui, et j'ai mis un commentaire ici: https://github.com/Adobe/brackets/issues/2752

La syntaxe qui a été discutée est une extension de Jasmine pour permettre l'ajout d'un car - vous pourrez donc écrire:

expect( fields[i].element.exists() ).toEqual(true).because( field[i].name + 'is expected to exist');

Cela fait encore l'objet de discussions après quelques années et pourrait ne pas aboutir. Une autre méthode que j'ai trouvée pour cela consiste à créer un matcher personnalisé. En général, je pense que je découragerais un matcher personnalisé sans être sûr de couvrir toutes les bases, mais dans ce cas, nous vérifions vraiment une valeur vrai/faux, le matcher n'est donc pas trop effrayant.

Nous pouvons créer le matcher personnalisé avec un beforeEach:

beforeEach(function() {
  var matchers = {
    toEqualBecause: function( value, message ) {
      this.message = function() {
        return "Expected '" + this.actual + "' to equal '" + value + "' because " + message;  
      };

      return this.actual == value;  
    }
 };

  this.addMatchers(matchers);
});

Nous pouvons ensuite utiliser ce matcher pour mettre un message avec nos échecs en tant que tels:

expect( field[i].element.exists() ).toEqualBecause( true, field[i].name );

Ce qui donnera une sortie d'échec incluant le nom du champ en tant que tel:

Expected 'false' to equal 'true' because account_name
45
PaulL

Oui, nous pouvons imprimer un message d'erreur personnalisé lorsqu'une expect () a échoué dans Jasmine.

 Code Snippet:

  it('print a custom error message when an expect failed', function() {

    var elemenToBeDisplayed=element(by.css("userName"));

    /*custom error message will be displayed if expected condition 
    failed*/

    expect(elemenToBeDisplayed.isPresent).toBe(true,'Write your custom       
         error message here');
   });
28
Suresh Salloju

Les autres réponses expliquent comment pirater "s'attendre", mais il existe une autre approche qui peut résoudre votre problème, bien qu'elle vous oblige à modifier légèrement votre façon de penser. Au lieu de penser à l'attente comme à votre comportement sous test, pensez à toutes les attentes sous un seul appel comme s'il était à votre comportement sous test.

Le cas où je rencontre le plus souvent ce problème, c’est quand j’ai une fonction qui effectue une sorte d’analyse intensive et que je veux écrire 20 tests presque identiques.

Organisez vos entrées et sorties comme suit:

var testDatas = [
  {
    input: 'stringtoparse1',
    output: 'String To Parse 1'
  },
  {
    input: 'stringtoparse2',
    output: 'String To Parse 2'
  },
  {
    input: 'stringtoparse3',
    output: 'String To Parse 3'
  },
];

Maintenant, parcourez la liste de vos données de test et appelez 'it' depuis dedans la boucle comme suit:

testDatas.forEach(function(test) {
  it('should parse for input ' + test.input, function() {
    expect(myParser(test.input).toEqual(test.output);
  });
});

Vous réduisez ainsi la quantité de code inutile parcourant vos tests et vous formatez un message pour chaque attente ou groupe d'attentes. 

2
codepuzzler

J'avais l'obligation de consigner des messages personnalisés pour Jasmine et j'ai utilisé la méthode suivante.

beforeEach(function(){
    this.addMatchers({
        customError: function(mesg){
                         this.message= function () {
                                           return mesg;
                                       };
                         return this.actual == true;
                         }
                     });
        });
if(<fail condidtion>){
    expect(false).customError(<Fail message>)
}

S'il vous plaît noter, ce que j'ai mentionné ci-dessus est par jasmine 1 format. Il y aura eu un léger changement si vous utilisez jasmine 2. J'espère que cela vous aidera

1
Murali Krishna

Vous pouvez le faire avec fail () method.

it('should fail with a message', function() {    
  if (!foo) fail(`your message here`);
});
1
mrded

Jasmine 3.3 inclut withContext en tant que moyen officiellement pris en charge pour spécifier des informations supplémentaires sur les attentes sans se soucier du matcher utilisé.

0
HolgerJeromin