Comment puis-je tester qu'une valeur est «supérieure ou égale à» dans Jasmine?

96

Je veux confirmer qu'une valeur est un décimal (ou 0), donc le nombre doit être supérieur ou égal à zéro et inférieur à 1.

describe('percent',function(){  

  it('should be a decimal', function() {

    var percent = insights.percent; 
    expect(percent).toBeGreaterThan(0);
    expect(percent).toBeLessThan(1);

  });

});

Comment imiter "> = 0"?

Bryce Johnson
la source
3
Essayez:expect(percent).not.toBeLessThan(0);
jcubic
2
Comme mentionné par @Patrizio Rullo dans une réponse ci-dessous, ses correspondants ont été fusionnés. Il y a maintenant un matcher toBeGreaterThanOrEqual disponible dans Jasmine 2.6: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Réponses:

109

J'ai pensé que je devrais mettre à jour cela car l'API a changé dans les nouvelles versions de Jasmine. L'API Jasmine a maintenant des fonctions intégrées pour:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Vous devez utiliser ces fonctions de préférence aux conseils ci-dessous.

Cliquez ici pour plus d'informations sur l'API Jasmine Matchers


Je sais que c'est une question ancienne et résolue, mais j'ai remarqué qu'une solution assez soignée avait été manquée. Puisque supérieur ou égal à est l'inverse de la fonction inférieure à, essayez:

expect(percent).not.toBeLessThan(0);

Dans cette approche, la valeur de pourcentage peut être renvoyée par une fonction asynchrone et traitée dans le cadre du flux de contrôle.

Andrew
la source
4
Celui-ci devrait être une réponse acceptée. Aussi: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov
C'est dangereux, car expect(NaN).not.toBeLessThan(0);réussit au lieu d'échouer. ( not.toBeLessThann'est que l'inverse si vous supposez qu'il percents'agit d'un nombre. Sinon, ce n'est pas l'inverse.)
Kristian Hanekamp
Exactement comme indiqué par @KristianHanekamp, ​​l'attente n'est pas fiable car elle passe également lorsque la valeur de 'percent' n'est pas un nombre (NaN).
Rohit
69

Il vous suffit d'exécuter d'abord l'opération de comparaison, puis de vérifier si elle est véridique.

describe('percent',function(){
  it('should be a decimal',function(){

    var percent = insights.percent;

    expect(percent >= 0).toBeTruthy();
    expect(percent).toBeLessThan(1);

  });   
});
Bryce Johnson
la source
9
Cela fonctionne, mais malheureusement, le message produit par un test échoué "> =" n'est pas particulièrement expressif ("le faux attendu est vrai"). Et au fait, il n'est pas nécessaire que le test soit asynchrone (ok, juste pinailler;).
hashchange le
2
@hashchange Avec un plugin tel que jasmine2-custom-message , le message d'erreur peut être personnalisé:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex
@TachyonVortex Cela semble intéressant! Je ne savais pas ce truc. Pour les comparaisons courantes comme >=, je préfère un matcher personnalisé car il garde les tests épurés (assez facile à faire, voir ma réponse ci-dessous), mais pour les comparaisons qui apparaissent moins fréquemment, ou qui ne sont pas assez expressives, ce plugin semble être exactement le bonne chose. Merci!
hashchange
Qu'en est-il de expect(percent).toBeGreaterThan(-1);xD je n'ai pas essayé
Cyril CHAPON
15

La version actuelle de Jasmine prend en charge toBeGreaterThan et toBeLessThan.

expect(myVariable).toBeGreaterThan(0);
DrMcCleod
la source
1
Question posée "supérieur ou égal à"
stealththeninja
5

Un peu étrange, ce n'est pas une fonctionnalité de base

Vous pouvez ajouter un matcher personnalisé comme celui-ci:

JasmineExtensions.js

yourGlobal.addExtraMatchers = function () {
    var addMatcher = function (name, func) {
        func.name = name;
        jasmine.matchers[name] = func;
    };

    addMatcher("toBeGreaterThanOrEqualTo", function () {
                   return {
                       compare: function (actual, expected) {
                           return {
                               pass: actual >= expected
                           };
                       }
                   };
               }
    );
};

En fait, vous définissez un constructeur pour votre matcher - c'est une fonction qui renvoie un objet matcher.

Incluez-le avant de «démarrer». Les matchers de base sont chargés au moment du démarrage.

Votre fichier html devrait ressembler à ceci:

<!-- jasmine test framework-->
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-2.0.0/jasmine-html.js"></script>

<!-- custom matchers -->
<script type="text/javascript" src="Tests/JasmineExtensions.js"></script>
<!-- initialisation-->
<script type="text/javascript" src="lib/jasmine-2.0.0/boot.js"></script>

Ensuite, dans votre boot.js, ajoutez l'appel pour ajouter les correspondants après que jasmine a été défini mais avant jasmine.getEnv (). Get env est en fait un appel de configuration (nommé légèrement).

Les correspondants sont configurés lors de l'appel à setupCoreMatchers dans le constructeur Env.

/**
 * ## Require &amp; Instantiate
 *
 * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference.
 */
window.jasmine = jasmineRequire.core(jasmineRequire);
yourGlobal.addExtraMatchers();

/**
 * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference.
 */
jasmineRequire.html(jasmine);

/**
 * Create the Jasmine environment. This is used to run all specs in a project.
 */
var env = jasmine.getEnv();

Ils montrent une autre façon d'ajouter des matchers personnalisés dans les exemples de tests, mais la façon dont cela fonctionne est de recréer le (s) matcher (s) avant chaque test à l'aide d'un fichier beforeEach. Cela semble assez horrible, alors j'ai pensé que j'opterais plutôt pour cette approche.

JonnyRaa
la source
5

Je suis en retard mais je le poste juste au cas où quelqu'un visite encore cette question à la recherche de réponses, j'utilise Jasmine version 3.0 et comme mentionné par @Patrizio Rullo, vous pouvez utiliser toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Il a été ajouté dans la version 2.5 selon les notes de publication - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Pour par exemple

expect(percent).toBeGreaterThanOrEqual(1,"This is optional expect failure message");

ou

expect(percent).toBeGreaterThanOrEqual(1);
Rohit
la source
Je pense que la version Jasmine> 2.3.4 n'exécute pas les spécifications dans l'ordre. Donc, s'ils veulent des spécifications dans l'ordre, ils peuvent créer des matchers personnalisés, mais s'ils sont d'accord avec des spécifications non ordonnées, ils peuvent choisir la version mentionnée ci-dessus.
TraxX
4

J'ai rencontré le même problème aujourd'hui, et il s'avère qu'il n'est pas si difficile d'ajouter un matcher personnalisé pour cela. Le principal avantage d'un matcher personnalisé est qu'il peut renvoyer des messages significatifs lorsqu'un test échoue.

Voici donc le code pour deux correspondants, .toBeAtLeast()et .toBeAtMost(), au cas où cela aiderait quelqu'un.

beforeEach( function () {

  // When beforeEach is called outside of a `describe` scope, the matchers are
  // available globally. See http://stackoverflow.com/a/11942151/508355

  jasmine.addMatchers( {

    toBeAtLeast: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual >= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be less than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at least " + expected;
          }
          return result;
        }
      };
    },

    toBeAtMost: function () {
      return {
        compare: function ( actual, expected ) {
          var result = {};
          result.pass = actual <= expected;
          if ( result.pass ) {
            result.message = "Expected " + actual + " to be greater than " + expected;
          } else {
            result.message = "Expected " + actual + " to be at most " + expected;
          }
          return result;
        }
      };
    }

  } );

} );
changement de hachage
la source
4

Il a juste été fusionné dans la branche principale de Jasmine GitHub mon patch pour ajouter les correspondants dont vous avez besoin:

Ajouter les correspondances toBeGreatThanOrEqual et toBeLessThanOrEqual

Mais je n'ai aucune idée de la version dans laquelle ce sera. En attendant, vous pouvez essayer d'utiliser le code de mon commit dans votre copie locale de Jasmine.

Patrizio Rullo
la source
Il a été fusionné dans la version 2.5.0 github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Patrizio Rullo
1

Je recommande d'utiliser ce pluging Jasmine: https://github.com/JamieMason/Jasmine-Matchers

Broda Noel
la source
Il contient un match `` à portée '', mais pas un match `` supérieur ou égal '' / `` inférieur ou égal '', bien que ...
Vegar
@Vegar, vous pouvez utiliser expect (number) .toBeGreaterThan (number);
Broda Noel le
1

Vous pouvez utiliser la fonction leastpour vérifier si une valeur est supérieure ou égale à une autre valeur.

Un alias de leastis gte(supérieur ou égal à). Vice versa, vous pouvez utiliser lte(inférieur ou égal à) pour vérifier le contraire.

Donc, pour répondre à la question, vous pouvez faire:

expect(percent).to.be.gte(0)

Robinson Collado
la source
Quelle version de Jasmine utilisez-vous? Je viens de passer de la 2.6.2 à la 2.8 et j'obtiens toujours l'erreur TypeError: Cannot read property 'be' of undefinedpourexpect(1).to.be.gte(-1);
Jonathan Parent Lévesque