Jak sprawdzić, czy wartość jest „większa lub równa” w Jasmine?

97

Chcę potwierdzić, że wartość jest ułamkiem dziesiętnym (lub 0), więc liczba powinna być większa lub równa zero i mniejsza niż 1.

describe('percent',function(){  

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

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

  });

});

Jak naśladować „> = 0”?

Bryce Johnson
źródło
3
Spróbuj:expect(percent).not.toBeLessThan(0);
jcubic
2
Jak wspomniał @Patrizio Rullo w odpowiedzi poniżej, jego dopasowania zostały połączone. W Jasmine 2.6 jest teraz dostępny element dopasowujący toBeGreaterThanOrEqual
Chris Parton

Odpowiedzi:

110

Pomyślałem, że powinienem to zaktualizować, ponieważ API zmieniło się w nowszych wersjach Jasmine. Jasmine API ma teraz wbudowane funkcje dla:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Tych funkcji należy używać zamiast poniższych porad.

Kliknij tutaj, aby uzyskać więcej informacji na temat interfejsu API dopasowań Jasmine


Wiem, że to stare i rozwiązane pytanie, ale zauważyłem, że brakowało dość zgrabnego rozwiązania. Ponieważ większe lub równe jest odwrotnością funkcji mniejsze niż, spróbuj:

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

W tym podejściu wartość procentu może zostać zwrócona przez funkcję asynchroniczną i przetworzona jako część przepływu sterowania.

Andrzej
źródło
4
Ta odpowiedź powinna zostać zaakceptowana. Także: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Siergiej Panfilov
Jest to niebezpieczne, ponieważ expect(NaN).not.toBeLessThan(0);przechodzi zamiast zawodzić. ( not.toBeLessThanjest tylko odwrotnością, jeśli percent
założysz,
Dokładnie tak, jak wskazał @KristianHanekamp, ​​oczekiwanie nie jest wiarygodne, ponieważ mija również, gdy wartość „procent” nie jest liczbą (NaN).
Rohit,
70

Musisz tylko najpierw uruchomić operację porównania, a następnie sprawdzić, czy jest to prawda.

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

    var percent = insights.percent;

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

  });   
});
Bryce Johnson
źródło
9
To działa, ale niestety, komunikat generowany przez niepowodzenie testu "> =" nie jest szczególnie wyrazisty ("oczekiwano, że fałsz będzie prawdziwy"). A tak przy okazji, nie ma potrzeby, aby test był asynchroniczny (ok, po prostu czepiam się;).
hashchange
2
@hashchange Dzięki wtyczce, takiej jak jasmine2-custom-message , komunikat o błędzie można dostosować:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex
@TachyonVortex Brzmi interesująco! Nie wiedziałem o tym. W przypadku typowych porównań, takich jak >=, wolę niestandardowy dopasowujący, ponieważ utrzymuje testy niezakłócone (dość łatwe, zobacz moją odpowiedź poniżej), ale w przypadku porównań, które pojawiają się rzadziej lub nie są wystarczająco wyraziste, ta wtyczka wydaje się być dokładnie tym właściwa rzecz. Dzięki!
hashchange
A co z expect(percent).toBeGreaterThan(-1);xD, nie próbowałem tego
Cyril CHAPON
15

Obecna wersja Jasmine obsługuje toBeGreaterThan i toBeLessThan.

expect(myVariable).toBeGreaterThan(0);
DrMcCleod
źródło
1
Pytanie zadane „większe lub równe”
stealththeninja
6

Jestem spóźniony, ale publikuję to na wypadek, gdyby ktoś nadal odwiedzał to pytanie w poszukiwaniu odpowiedzi, używam wersji Jasmine 3.0 i jak wspomniał @Patrizio Rullo, możesz użyć toBeGreaterThanOrEqual / toBeLessThanOrEqual .

Został dodany w wersji 2.5 zgodnie z informacjami o wydaniu - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Np

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

lub

expect(percent).toBeGreaterThanOrEqual(1);
Rohit
źródło
Myślę, że wersja Jasmine> 2.3.4 nie wykonuje specyfikacji w kolejności. Więc jeśli chcą specyfikacji w kolejności, mogą tworzyć niestandardowe dopasowania, ale jeśli są w porządku z nieuporządkowanymi specyfikacjami, mogą wybrać wspomnianą powyżej wersję.
TraxX
5

Nieco dziwne to nie jest podstawowa funkcjonalność

Możesz dodać niestandardowy element dopasowujący w następujący sposób:

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

W efekcie definiujesz konstruktora dla swojego dopasowania - jest to funkcja, która zwraca obiekt dopasowujący.

Uwzględnij to przed „uruchomieniem”. Podstawowe dopasowania są ładowane podczas uruchamiania.

Twój plik html powinien wyglądać następująco:

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

Następnie w pliku boot.js dodaj wywołanie, aby dodać elementy dopasowujące po zdefiniowaniu jasmine, ale przed jasmine.getEnv (). Get env jest w rzeczywistości wywołaniem konfiguracyjnym (o nieco mylącej nazwie).

Dopasowania otrzymują konfigurację w wywołaniu setupCoreMatchers w konstruktorze 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();

Pokazują inny sposób dodawania niestandardowych dopasowań w przykładowych testach, jednak sposób, w jaki to działa, polega na odtworzeniu dopasowania (ów) przed każdym pojedynczym testem przy użyciu pliku beforeEach. Wydaje się to dość okropne, więc pomyślałem, że zamiast tego wybiorę takie podejście.

JonnyRaa
źródło
4

Dziś napotkałem ten sam problem i jak się okazuje, nie jest trudno dodać do niego niestandardowy element dopasowujący. Główną zaletą dopasowywania niestandardowego jest to, że może zwracać znaczące komunikaty, gdy test się nie powiedzie.

Oto kod dla dwóch dopasowań .toBeAtLeast()i .toBeAtMost()na wypadek, gdyby to komuś pomogło.

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

  } );

} );
hashchange
źródło
1

Polecam użycie tej wtyczki Jasmine: https://github.com/JamieMason/Jasmine-Matchers

Broda Noel
źródło
Zawiera dopasowanie „w zakresie”, ale nie dopasowania „większe lub równe” / „mniejsze lub równe”, chociaż ...
Vegar
@Vegar, możesz użyć oczekiwać (liczba) .toBeGreaterThan (liczba);
Broda Noel
1

Możesz użyć funkcji, leastaby sprawdzić, czy wartość jest większa lub równa innej wartości.

Alias leastjest gte(wielki lub równy). I odwrotnie, możesz użyć lte(mniejsze lub równe), aby sprawdzić odwrotnie.

Aby więc odpowiedzieć na pytanie, możesz zrobić:

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

Robinson Collado
źródło
Której wersji Jasmine używasz? Wystarczy zaktualizować z 2.6.2 do 2.8 i nadal pojawia się błąd TypeError: Cannot read property 'be' of undefinedzaexpect(1).to.be.gte(-1);
Jonathan dominującej Lévesque