2012-11-23 11 views
25

bekliyoruz:Yasemin mantığını (A VEYA B bekliyoruz) iki beklentilerin biri karşılandığında eğer başarılı olmak için testi ayarlamanız gerekir

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)); 
expect(mySpy.mostRecentCall.args[0]).toEqual(false); 

Böyle bakmak için beklenen:

expect(mySpy.mostRecentCall.args[0]).toEqual(jasmine.any(Number)).or.toEqual(false); 

Dokümanlarda kaçırdığım bir şey var mı yoksa kendi eşleştiricimi mi yazmalıyım?

+0

Dokümantasyonu kontrol ettim ve bazı kodları denedim, ama sanırım "kolayca" özür dilemiyoruz. Ama bulduğum şeye göre kendi "zincirlenebilir" eşleştiricinizi yaratabilirsiniz. – Magus

cevap

10

Not: Bu çözüm, Jasmine v2.0'dan önceki sürümler için sözdizimi içerir. Özel matchers hakkında daha fazla bilgi için şimdi, bakınız: https://jasmine.github.io/2.0/custom_matcher.html


Matchers.js tek bir 'sonuç değiştirici' ile çalışan tek - not:

çekirdek/Spec.js:

jasmine.Spec.prototype.expect = function(actual) { 
    var positive = new (this.getMatchersClass_())(this.env, actual, this); 
    positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); 
    return positive; 

çekirdek/Matchers.js:

jasmine.Matchers = function(env, actual, spec, opt_isNot) { 
    ... 
    this.isNot = opt_isNot || false; 
} 
... 
jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { 
    return function() { 
    ... 
    if (this.isNot) { 
     result = !result; 
    } 
    } 
} 

Gerçekten de kendi eşleştiricinizi (before veya bloğu içinden doğru this için) yazmanız gerekiyor. Örneğin:

this.addMatchers({ 
    toBeAnyOf: function(expecteds) { 
     var result = false; 
     for (var i = 0, l = expecteds.length; i < l; i++) { 
     if (this.actual === expecteds[i]) { 
      result = true; 
      break; 
     } 
     } 
     return result; 
    } 
}); 
+1

İhtiyacım olan tek şey 'çoklu eşleşme yok', bu cevap çok daha fazlası! :) Kodu için teşekkürler. Ben jasmine.any (Number) 'davayı ele aldığını sanmıyorum, ama çalışabilirim. Eğer bir şey yapmazsan, cevabınıza cevap vereceğim. – naugtur

10

Bu eski bir sorudur, ancak herkesin hala görmesi durumunda başka bir cevabım var.

Mantıksal OR ifadesi oluşturmaya ve bunu beklemeye ne dersiniz? Şunun gibi:

var argIsANumber = !isNaN(mySpy.mostRecentCall.args[0]); 
var argIsBooleanFalse = (mySpy.mostRecentCall.args[0] === false); 

expect(argIsANumber || argIsBooleanFalse).toBe(true); 

Bu şekilde, açıkça VEYA koşulu beklemek/test edebilirsiniz ve sadece bir Boole maç/uyumsuzluğu test etmek için Jasmine kullanmak gerekir. Jasmine 1 veya Jasmine 2'de çalışacaklar :)

18

Diziye birden çok karşılaştırılabilir dizge ekleyin ve sonra karşılaştırın. Karşılaştırma sırasını tersine çevir.

expect(["New", "In Progress"]).toContain(Status); 
+0

Harika bir fikir, çok özlü! Ve beklediğinden daha açık hata mesajları verir (Durum == "Yeni" || Durum == "Devam Ediyor") toBe (true); ' –

İlgili konular