2014-06-06 7 views
66

Chcę potwierdzić, że wartość jest dziesiętną (lub 0), więc liczba ta powinna być większa lub równa zeru i mniej niż 1.Jak mogę sprawdzić, czy wartość jest "większa lub równa" w Jasmine?

describe('percent',function(){ 

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

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

    }); 

}); 

Jak mogę naśladować "> = 0 "?

+0

może być związany [Sprawdzanie dwóch granic jaśminu (między dopasowującego)] (http://stackoverflow.com/questions/28732881/checking-two-boundaries-with- jaśmin-między-matcher/28732882 # 28732882). – alecxe

+1

Spróbuj: 'spodziewać się (procent) .not.toBeLessThan (0);' – jcubic

+2

Jak wspomniano w @ Patrizio Rullo w poniższej odpowiedzi, jego łączniki zostały połączone. W Jasmine 2.6: https:/znajduje się teraz toBeGreaterThanOrEqual Matcher. /jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual –

Odpowiedz

60

Najpierw należy przeprowadzić operację porównania, a następnie sprawdzić, czy to prawda.

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

    var percent = insights.percent; 

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

    }); 
}); 
+5

To działa, ale niestety komunikat wygenerowany przez niepowodzenie testu "> =" nie jest szczególnie wyrazisty ("oczekiwano, że będzie to prawda"). A tak przy okazji, nie ma potrzeby, aby test był asynchroniczny (ok, po prostu naciąganie;). – hashchange

+2

@hashchange Z wtyczką taką jak [komunikat niestandardowy jaśmin2] (https://github.com/avrelian/jasmine2-custom-message), komunikat o błędzie można dostosować: 'ponieważ ('oczekiwany procent jest większy niż lub równe zero "). expect (procent> = 0) .toBeTruthy();' – TachyonVortex

+0

@TachyonVortex Brzmi interesująco! Nie wiedziałem o tym. W przypadku typowych porównań, takich jak '> =', preferuję niestandardowy matcher, ponieważ zapewnia on niezakłócone testy (łatwe do zrobienia, zobacz moją odpowiedź poniżej), ale w przypadku porównań, które pojawiają się rzadziej lub nie są wystarczająco wyraziste, wydaje się, że wtyczka wydaje się być być dokładnie tą właściwą. Dzięki! – hashchange

5

Nieco strangley nie jest to podstawowa funkcjonalność

Możesz dodać niestandardowy mechanizm dopasowywania tak:

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 masz definiowania konstruktora dla twojego Matchera - to funkcja, która zwraca obiekt Matchera.

Dołącz to przed "uruchomieniem". Podstawowe moduły matujące są ładowane podczas rozruchu.

pliku 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 swoim boot.js dodać wywołanie dodać dopasowujących po jaśmin zostało zdefiniowane, ale przed jasmine.getEnv(). Get env jest w rzeczywistości (nieco zwodniczo nazwaną) konfiguracją połączenia.

Łączyny 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(); 

Oni pokazują inny sposób dodawania niestandardowych dopasowujących w testach próbnych, jednak sposób działania jest odtworzenie matcher (ów) przed każdym testem z użyciem beforeEach. To wydaje się dość okropne, więc pomyślałem, że zamiast tego pójdę z tym podejściem.

1

Polecam skorzystać z tej Jasmine pluging: https://github.com/JamieMason/Jasmine-Matchers

+0

Zawiera on 'w zakresie'-matcher, ale nie' większy lub równy '/' mniejszy lub równy 'matcher, choć ... – Vegar

+0

@Vegar, możesz użyć oczekiwać (numer) .toBeGreaterThan (numer); –

4

mam biegać w tym samym numerze dzisiaj, i jak się okazuje, nie jest to takie trudne, aby dodać niestandardowy mechanizm dopasowywania do niego. Główną zaletą niestandardowego matchera jest to, że może zwracać sensowne komunikaty, gdy test kończy się niepowodzeniem.

Oto kod dla dwóch dopasowań, .toBeAtLeast() i .toBeAtMost(), w przypadku, gdy pomaga komuś.

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

    }); 

}); 
79

Wiem, że jest to stare i rozwiązane pytanie, ale zauważyłem, że brakowało całkiem porządnego rozwiązania. Ponieważ większa niż lub równa jest odwrotnością poniżej funkcji Spróbuj:

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

W tym rozwiązaniu wartość procentu można przywrócić przez funkcję asynchronicznym i przetwarzane w ramach kontroli przepływu.

+3

Ta odpowiedź powinna zostać przyjęta. Ponadto: 'oczekiwać (2 + 2) .not.toBe (5)', 'oczekiwać (2 + 2) .toBeGreaterThan (0)', 'oczekiwać (2 + 2) .toBeLessThan (5)' –

+1

To jest poprawne sposób to zrobić –

+0

Jest to niebezpieczne, ponieważ 'oczekiwać (NaN) .not.toBeLessThan (0); 'przechodzi zamiast niepowodzenia. ('not.toBeLessThan' jest tylko odwrotnością, jeśli założysz, że' procent' jest liczbą, w przeciwnym razie nie jest odwrotnością.) –

4

To było po prostu połączyły się w głównej gałęzi Jasmine GitHub moją poprawkę, aby dodać dopasowujących musisz:

Add toBeGreatThanOrEqual and toBeLessThanOrEqual matchers

Ale nie mam pojęcia, w co uwalnia będzie. W międzyczasie możesz spróbować użyć kodu mojego zatwierdzenia w lokalnej kopii Jasmine.

+0

Został scalony w wersji 2.5.0 https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md –

8

Obecna wersja Jasmine obsługuje ToBeGreaterThan i toBeLessThan.

expect(myVariable).toBeGreaterThan(0); 
+0

Pytanie zadane "większe niż lub równe" – stealththeninja

0

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

Alias ​​z least jest gte (wielki lub równy). Odwrotnie, możesz użyć wartości lte (mniejszej lub równej), aby sprawdzić przeciwieństwo.

Tak więc, aby odpowiedzieć na pytanie, można zrobić:

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

+0

Którą wersję Jasmine używasz ? Właśnie aktualizuję wersję 2.6.2 do 2.8 i nadal pojawia się błąd "TypeError: Can not read property" be 'of undefined' dla 'expect (1) .to.be.gte (-1);' –

0

jestem późno na to, ale umieszczenie go na wszelki wypadek ktoś jeszcze odwiedza to pytanie szuka odpowiedzi, używam Jasmine w wersji 3.0 i jak wspomina @Patrizio Rullo, możesz użyć doBeGreaterThanOrEqual/toBeLessThanOrEqual.

Dodano, w wersji 2.5 zgodnie o wydaniu - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Na przykład

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

lub

expect(percent).toBeGreaterThanOrEqual(1); 
Powiązane problemy