Jasmine'de bir değerin "büyük veya eşit" olduğunu nasıl test edebilirim?


100

Bir değerin ondalık (veya 0) olduğunu onaylamak istiyorum, bu nedenle sayı sıfırdan büyük veya sıfıra eşit ve 1'den küçük olmalıdır.

describe('percent',function(){  

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

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

  });

});

"> = 0" ı nasıl taklit ederim?



3
Deneyin:expect(percent).not.toBeLessThan(0);
jcubic

2
@ Patrizio Rullo tarafından aşağıdaki yanıtta belirtildiği gibi, eşleştiricileri birleştirildi. Artık Jasmine 2.6'da bir toBeGreaterThanOrEqual eşleştirici var: jasmine.github.io/api/2.6/matchers.html#toBeGreaterThanOrEqual
Chris Parton

Yanıtlar:


113

Jasmine'in yeni sürümlerinde API değiştiği için bunu güncellemem gerektiğini düşündüm. Jasmine API artık aşağıdakiler için yerleşik işlevlere sahiptir:

  • toBeGreaterThanOrEqual
  • toBeLessThanOrEqual

Bu işlevleri aşağıdaki tavsiyelere tercih ederek kullanmalısınız.

Jasmine matchers API hakkında daha fazla bilgi için burayı tıklayın


Bunun eski ve çözülmüş bir soru olduğunu biliyorum, ancak oldukça düzgün bir çözümün kaçırıldığını fark ettim. Büyüktür veya eşittir, küçüktür işlevinin tersi olduğundan, Deneyin:

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

Bu yaklaşımda, yüzde değeri bir zaman uyumsuz işlev tarafından döndürülebilir ve kontrol akışının bir parçası olarak işlenebilir.


5
Bu cevap kabul edilmelidir. Ayrıca: expect(2 + 2).not.toBe(5), expect(2 + 2).toBeGreaterThan(0),expect(2 + 2).toBeLessThan(5)
Sergei Panfilov

Bu tehlikelidir, çünkü expect(NaN).not.toBeLessThan(0);başarısız olmak yerine geçer. ( not.toBeLessThanbunun percentbir Sayı olduğunu varsayarsanız bunun tersidir . Aksi takdirde, tersi olmaz.)
Kristian Hanekamp

Tam olarak @KristianHanekamp'ın işaret ettiği gibi, beklenti güvenilir değildir, çünkü 'yüzde' değeri bir Sayı (NaN) olmadığında da geçer.
Rohit

70

Önce karşılaştırma işlemini çalıştırmanız ve ardından doğru olup olmadığını kontrol etmeniz yeterlidir.

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

    var percent = insights.percent;

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

  });   
});

9
Bu işe yarıyor, ancak ne yazık ki, başarısız bir "> =" testinin ürettiği mesaj özellikle anlamlı değil ("yanlışın doğru olması bekleniyor"). Ve bu arada, testin asenkron olmasına gerek yok (tamam, sadece nitpicking;).
hashchange

2
@hashchange Jasmine2-custom-message gibi bir eklentiyle , hata mesajı özelleştirilebilir:since('expected percent to be greater than or equal to zero').expect(percent >= 0).toBeTruthy();
TachyonVortex

@TachyonVortex Kulağa ilginç geliyor! O şeyi bilmiyordum. Gibi yaygın karşılaştırmalar için >=, testleri düzenli tuttuğu için özel bir eşleştiriciyi tercih ederim (yapmak için yeterince kolay, aşağıdaki cevabıma bakın), ancak daha seyrek ortaya çıkan veya yeterince açıklayıcı olmayan karşılaştırmalar için, bu eklenti tam olarak doğru şey. Teşekkürler!
hashchange

Peki ya expect(percent).toBeGreaterThan(-1);xD denemedim
Cyril CHAPON

15

Jasmine'in mevcut sürümü toBeGreaterThan ve toBeLessThan'ı desteklemektedir.

expect(myVariable).toBeGreaterThan(0);

1
Soru sordu "büyük veya eşit"
stealththeninja

6

Buna geç kaldım, ancak cevap arayan birisinin hala bu soruyu ziyaret etmesi durumunda gönderiyorum, Jasmine 3.0 sürümünü kullanıyorum ve @Patrizio Rullo tarafından belirtildiği gibi toBeGreaterThanOrEqual / toBeLessThanOrEqual kullanabilirsiniz .

Sürüm notlarına göre sürüm 2.5'te eklendi - https://github.com/jasmine/jasmine/blob/master/release_notes/2.5.0.md

Örneğin

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

veya

expect(percent).toBeGreaterThanOrEqual(1);

Yasemin sürüm> 2.3.4'ün özellikleri sırayla yerine getirmediğini düşünüyorum. Bu nedenle, spesifikasyonları sırayla istiyorlarsa, özel eşleştiriciler oluşturabilirler, ancak sırasız spesifikasyonlarda sorun yoksa, yukarıda belirtilen sürümü seçebilirler.
TraxX

5

Biraz tuhaf, bu temel işlev değil

Bunun gibi özel bir eşleştirici ekleyebilirsiniz:

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

Aslında eşleştiriciniz için bir kurucu tanımlıyorsunuz - bu bir eşleştirme nesnesi döndüren bir işlev.

Bunu "başlatmadan" önce ekleyin. Temel eşleştiriciler, önyükleme sırasında yüklenir.

Html dosyanız şöyle görünmelidir:

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

Daha sonra boot.js dosyanıza yasemin tanımlandıktan sonra ancak yasemin.getEnv () 'den önce eşleştiricileri eklemek için çağrıyı ekleyin. Get env aslında (biraz yanıltıcı bir şekilde adlandırılmış) bir kurulum çağrısıdır.

Eşleştiriciler, Env yapıcısındaki setupCoreMatchers çağrısında kurulumu alır.

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

Numune testlerine özel eşleştiriciler eklemenin başka bir yolunu gösterirler, ancak bunun çalışma şekli, her bir testten önce bir beforeEach. Bu oldukça korkunç görünüyor, bu yüzden onun yerine bu yaklaşımı tercih edeceğimi düşündüm.


4

Bugün aynı sorunla karşılaştım ve ortaya çıktığı gibi, bunun için özel bir eşleştirici eklemek o kadar da zor değil. Özel bir eşleştiricinin temel avantajı, bir test başarısız olduğunda anlamlı mesajlar döndürebilmesidir.

İşte iki eşleştiricinin kodu .toBeAtLeast()ve .toBeAtMost()birine yardım etmesi durumunda.

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

  } );

} );



1

Fonksiyonu least, bir değerin başka bir değerden büyük veya ona eşit olup olmadığını kontrol etmek için kullanabilirsiniz .

Bir takma leastolan gte(daha büyük ya da eşittir). Tam tersi, tersini ltekontrol etmek için (küçüktür veya eşittir) kullanabilirsiniz.

Yani soruyu cevaplamak için şunları yapabilirsiniz:

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


Jasmine'in hangi sürümünü kullanıyorsunuz? Ben 2.6.2 den 2.8 yükseltme sadece ve hala hata alıyorum TypeError: Cannot read property 'be' of undefinediçinexpect(1).to.be.gte(-1);
Jonathan Veli Levesque
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.