2012-02-29 14 views
33

https://github.com/pivotal/jasmine/wiki/Matchers de belgeleri aşağıdakileri içerir: this question tartışıldığı gibiJasmine'in toThrow eşleyicisi, anonim bir işleve sarılacak argümanı gerektirir mi?

expect(function(){fn();}).toThrow(e); 

, aşağıdakileri yapar değil çalışma biz oldukça fn()

expect(fn()).toThrow(e); 
çağrı sonucu daha expect bir işlev nesnesini geçmek istediğiniz için

Soru 1: Aşağıdakiler çalışıyor mu?

expect(fn).toThrow(e); 

Soru 2: Ben bir yönteme doIt içeren bir nesne thing tanımladığınız, aşağıdaki çalışır?

expect(thing.doIt).toThrow(e); 

(2a: eğer öyleyse, doIt yönteme argüman geçmemize için bir yol var mı?)

Ampirik cevap evet gibi görünüyor ama oldukça yeterli js kapsam belirleme benim anlayış güvenmiyorum emin olmak.

Teşekkürler!

try { 
    this.actual(); 
} catch (e) { 
    exception = e; 
} 
if (exception) { 
    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); 
} 

Bu toThrow yöntemin en önemli parçasıdır:

+0

Olası yinelenen: http://stackoverflow.com/questions/4144686/jasmine-how-to-write-a-test-which-expects-an-error-to-be-thrown – Petrov

cevap

47

:

Daha doğrusu tercih ederdik

,

expect(myTestFunction, arg1, arg2).toThrow(); 

Ama açıkça Bilginize

expect(function(){myTestFunction(arg1, arg2);}).toThrow("some error"); 

yapmakla Tamam duyuyorum biz de hata regex maç kullanabilirsiniz unutmayın Anonim işlev sargısıyla, Function.bind'u kullanarak kullanıma açabiliriz. ECMAScript 5. Bu, tarayıcıların en son sürümlerinde çalışır ve işlevi kendiniz tanımlayarak eski tarayıcıları yamayabilirsiniz. Örnek bir tanım Mozilla Developer Network'da verilmektedir.

Burada, Yasemin ile bind'un nasıl kullanılabileceğine dair bir örnek. f çağrıldığında bind temin

describe('using bind with jasmine', function() { 

    var f = function(x) { 
     if(x === 2) { 
      throw new Error(); 
     } 
    } 

    it('lets us avoid using an anonymous function', function() { 
     expect(f.bind(null, 2)).toThrow(); 
    }); 

}); 

ilk bağımsız this değişken olarak kullanılır. Herhangi bir ek argüman, çağrıldığında f'a iletilir. Burada 2 ilk ve tek argümanı olarak geçiyor.

+1

Bu benim için çalışıyor. Not: f.bind'deki null'u hatırlayın (veya parametreleriniz çağrılan işlevde bir kez kapalı olacaktır. İlk kez bunu özledim. (Bunu bulmamı kolaylaştırmak için buna bağladım: http: //geekswithblogs.net /Aligned/archive/2013/03/21/use-the-bind-method-for-jasmine-tothrow-tests.aspx) Teşekkürler! – Aligned

6

Jasmine source code bakabilirsiniz sağlar. Yani tüm yöntem, beklemek istediğiniz yöntemi uygulamak ve bir istisnanın atılıp atılmadığını kontrol etmektir. Bu nedenle, örneklerinde fn veya thing.doIt'da Yasemin aranacak ve bir hata atılıp atılmadığını kontrol edecek ve bu hatanın türü toThrow'a geçtiniz.

+0

Ne yazık ki Parametreler alan bir işlevi test etmem gerekirse, onu bir işlevle sarmam gerekecek gibi görünüyor. –

4

Maalesef, parametre alan bir işlevi test etmem gerekirse, onu bir işlevle sarmam gerekecek gibi görünüyor.

expect(function(){myTestFunction(arg1, arg2);}).toThrowError(/err/); 
+0

Jasmine 2.0 toThrowError (/ regex /) –

0

böyle kullanılırsa:

expect(myTestFunction(arg)).toThrowAnyError(); // incorrect

Sonra işlev myTestFunction(arg)expect(...) önce idam ve Yasemin şey yapmadan herhangi şansı vardır ve otomatik bir başarısızlıkla sonuçlanan testini çöküyor önce bir istisna edilir . (Kod olarak beklenen çalışmıyor yani) işlevi myTestFunction(arg) şey atma değilse

ardından Yasemin sadece fonksiyonunsonuç almak ve hatalar için kontrol ediyorum - yanlış olduğu. Bu sorunu gidermek için, bir hata atması beklenen kodun bir işlev içinde sarılması beklenir. Üste | Bu, bunu yürütecek ve beklenen istisnayı kontrol edecek olan Jasmine'e aktarıldı.

expect(() => myTestFunction(arg)).toThrowAnyError(); // correct

İlgili konular