Wie kann ich testen, ob ein Wert in Jasmine größer oder gleich ist?

94

Ich möchte bestätigen, dass ein Wert eine Dezimalzahl (oder 0) ist, daher sollte die Zahl größer oder gleich Null und kleiner als 1 sein.

describe('percent',function(){  

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

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

  });

});

Wie ahme ich "> = 0" nach?

Bryce Johnson
quelle
3
Versuchen Sie:expect(percent).not.toBeLessThan(0);
jcubic
2
Wie von @Patrizio Rullo in einer Antwort unten erwähnt, wurden seine Matcher zusammengeführt. In Jasmine 2.6 ist jetzt ein toBeGreaterThanOrEqual-Matcher verfügbar: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Antworten:

108

Ich dachte, ich sollte dies aktualisieren, da sich die API in neueren Versionen von Jasmine geändert hat. Die Jasmine-API verfügt jetzt über integrierte Funktionen für:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Sie sollten diese Funktionen den folgenden Hinweisen vorziehen.

Klicken Sie hier, um weitere Informationen zur Jasmine Matchers API zu erhalten


Ich weiß, dass dies eine alte und gelöste Frage ist, aber ich habe festgestellt, dass eine ziemlich ordentliche Lösung übersehen wurde. Da größer oder gleich ist die Umkehrung der Funktion kleiner als, versuchen Sie:

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

Bei diesem Ansatz kann der Prozentwert von einer asynchronen Funktion zurückgegeben und als Teil des Kontrollflusses verarbeitet werden.

Andrew
quelle
4
Diese Antwort sollte akzeptiert werden. Auch: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov
Das ist gefährlich, weil es expect(NaN).not.toBeLessThan(0);passiert, anstatt zu scheitern. ( not.toBeLessThanist nur die Umkehrung, wenn Sie annehmen, dass dies percenteine Zahl ist. Andernfalls ist es nicht die Umkehrung.)
Kristian Hanekamp
Genau wie von @KristianHanekamp angegeben, ist die Erwartung nicht zuverlässig, da sie auch dann gilt, wenn der Wert 'Prozent' keine Zahl (NaN) ist.
Rohit
69

Sie müssen nur zuerst die Vergleichsoperation ausführen und dann überprüfen, ob sie wahr ist.

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

    var percent = insights.percent;

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

  });   
});
Bryce Johnson
quelle
9
Dies funktioniert, aber leider ist die Nachricht, die durch einen fehlgeschlagenen "> =" - Test erzeugt wird, nicht besonders aussagekräftig ("erwartet, dass falsch wahr ist"). Übrigens muss der Test nicht asynchron sein (ok, nur Nitpicking;).
Hashchange
2
@hashchange Mit einem Plugin wie jasmine2-custom-message kann die Fehlermeldung angepasst werden:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex
@TachyonVortex Klingt interessant! Ich wusste nichts davon. Für gängige Vergleiche wie >=bevorzuge ich einen benutzerdefinierten Matcher, da er die Tests übersichtlich hält (einfach genug, siehe meine Antwort unten), aber für Vergleiche, die seltener oder nicht aussagekräftig genug sind, scheint dieses Plugin genau das zu sein das Richtige. Vielen Dank!
Hashchange
Was ist mit expect(percent).toBeGreaterThan(-1);xD ? Ich habe es nicht ausprobiert
Cyril CHAPON
15

Die aktuelle Version von Jasmine unterstützt toBeGreaterThan und toBeLessThan.

expect(myVariable).toBeGreaterThan(0);
DrMcCleod
quelle
1
Frage gestellt "größer oder gleich"
stealththeninja
5

Etwas seltsam ist dies keine grundlegende Funktionalität

Sie können einen benutzerdefinierten Matcher wie folgt hinzufügen:

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

Tatsächlich definieren Sie einen Konstruktor für Ihren Matcher - eine Funktion, die ein Matcher-Objekt zurückgibt.

Fügen Sie dies hinzu, bevor Sie "booten". Die grundlegenden Matcher werden beim Booten geladen.

Ihre HTML-Datei sollte folgendermaßen aussehen:

<!-- 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>

Fügen Sie dann in Ihrer boot.js den Aufruf hinzu, um die Matcher hinzuzufügen, nachdem Jasmin definiert wurde, aber vor jasmine.getEnv (). Get env ist eigentlich ein (leicht irreführend benannter) Setup-Aufruf.

Die Matcher werden beim Aufruf von setupCoreMatchers im Env-Konstruktor eingerichtet.

/**
 * ## 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();

Sie zeigen eine andere Möglichkeit, benutzerdefinierte Matcher in den Beispieltests hinzuzufügen. Die Funktionsweise besteht jedoch darin, die Matcher vor jedem einzelnen Test mit a neu zu erstellen beforeEach. Das scheint ziemlich schrecklich zu sein, also dachte ich, ich würde stattdessen diesen Ansatz wählen.

JonnyRaa
quelle
5

Ich bin spät dran, aber wenn ich es noch poste, falls jemand diese Frage noch besucht, um nach Antworten zu suchen, verwende ich Jasmine Version 3.0 und wie von @Patrizio Rullo erwähnt, können Sie toBeGreaterThanOrEqual / toBeLessThanOrEqual verwenden .

Es wurde in Version 2.5 gemäß den Versionshinweisen hinzugefügt - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Zum Beispiel

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

oder

expect(percent).toBeGreaterThanOrEqual(1);
Rohit
quelle
Ich denke, Jasmin Version> 2.3.4 führt Spezifikationen nicht in der richtigen Reihenfolge aus. Wenn sie also die Spezifikationen in der richtigen Reihenfolge wünschen, können sie benutzerdefinierte Matcher erstellen. Wenn sie jedoch mit ungeordneten Spezifikationen einverstanden sind, können sie die oben genannte Version auswählen.
TraxX
4

Ich bin heute auf dasselbe Problem gestoßen, und wie sich herausstellt, ist es nicht so schwierig, einen benutzerdefinierten Matcher dafür hinzuzufügen. Der Hauptvorteil eines benutzerdefinierten Matchers besteht darin, dass er aussagekräftige Nachrichten zurückgeben kann, wenn ein Test fehlschlägt.

Hier ist also der Code für zwei Matcher, .toBeAtLeast()und .toBeAtMost()falls er jemandem hilft.

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

  } );

} );
Hashwechsel
quelle
4

Es wurde gerade im Jasmine GitHub-Hauptzweig mein Patch zusammengeführt, um die benötigten Matcher hinzuzufügen:

Fügen Sie zu BeGreatThanOrEqual und zu BeLessThanOrEqual Matchern hinzu

Aber ich habe keine Ahnung, in welcher Veröffentlichung es sein wird. In der Zwischenzeit können Sie versuchen, den Code meines Commits in Ihrer lokalen Jasmine-Kopie zu verwenden.

Patrizio Rullo
quelle
Es wurde in Release 2.5.0 fusioniert github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md
Patrizio Rullo
1

Ich empfehle die Verwendung dieses Jasmine-Steckers: https://github.com/JamieMason/Jasmine-Matchers

Broda Noel
quelle
Es enthält einen "in Reichweite" -Matcher, aber keinen "größeren oder gleichen" / "kleineren oder gleichen" Matcher ...
Vegar
@Vegar, Sie können erwarten (Nummer) .toBeGreaterThan (Nummer) verwenden;
Broda Noel
1

Mit der Funktion können Sie leastüberprüfen, ob ein Wert größer oder gleich einem anderen Wert ist.

Ein Alias ​​von leastis gte(groß oder gleich). Umgekehrt können Sie ltedas Gegenteil überprüfen (kleiner oder gleich).

Um die Frage zu beantworten, können Sie Folgendes tun:

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

Robinson Collado
quelle
Welche Version von Jasmine verwenden Sie? Ich aktualisiere gerade von 2.6.2 auf 2.8 und erhalte immer noch den Fehler TypeError: Cannot read property 'be' of undefinedfürexpect(1).to.be.gte(-1);
Jonathan Parent Lévesque