2009-02-06 24 views
35

İki sorum var:Qunit parametreli testler ve alaylı

qunit'te parametreli birim testleri yapılabilir mi?

qunit ile nasıl dalga geçiyorsunuz ör. getJSON numaralı telefon görüşmesi mi yapıyorsunuz? İşte

var functionToTest = function() { 
     $.ajax({ 
      url: 'someUrl', 
      type: 'POST', 
      dataType: 'json', 
      data: 'foo=1&foo=2&foo=3', 
      success: function (data) { 
       $('#main').html(data.someProp); 
      } 
     }); 
    }; 

test durumu var:

Teşekkür

cevap

49

ajax istekleri alay, böyle bir şey deneyebilirsiniz için

... İşte

fonksiyonu testine istiyoruz zaten
test('ajax mock test', function() { 
     var options = null; 
     jQuery.ajax = function (param) { 
      options = param; 
     }; 
     functionToTest(); 
     options.success({ 
      someProp: 'bar' 
     }); 
     same(options.data, 'foo=1&foo=2&foo=3'); 
     same($('#main').html(), 'bar'); 
    }); 

Esasen jQuery'nin ajax işlevini geçersiz kılar ve ardından aşağıdakileri denetler. 2 şey: - ajax fonksiyonu geçildi değeri -, başarı geri çağırır ve buna

+4

Bu fonksiyonu (param) {seçenekleri = param;} almak için yaklaşık yarım saat sürdü, ama sonra bana çarptı .. . Gerçekten havalı. –

+0

Güzel. Gerçekten hoş. – StuperUser

+0

Yuvalanmış aramaları test ediyorsanız, bu seçenekler bir dizide en iyi şekilde tutulur ve her bir çağrıda .push() seçenek nesneleri bu diziye alınır mı? – StuperUser

5

Sadece XMLHttpRequests alay etmeye izin veren ve aynı zamanda basit bir sahte sunucu API'si sunan Sinon.JS'u kullanmaya başladım. Kullanımı gerçekten çok kolay! Aynı zamanda qunit ile entegrasyon sunar.

15

jQuery'nin AJAX işlevini geçersiz kılmak yerine, .appendTo tarafından geliştirilen jQuery Mockjax eklentisini de kullanabilirsiniz. Bu eklenti aslında diğer cevabın önerdiği şeyi yapar, ancak çok daha karmaşık alaylara izin verir. Eğer işlevi varsa, örneğin,: İkinci alaycı fonksiyonu dahil edilebilir

$.mockjax({ 
    url:"/api/user", 
    type:"GET", 
    response:function(requestData){ 
     //handle the mock response in here 
     this.responseText = '{"fullname":"Mr. Foo Bar"}'; 
    } 
}); 

:

$.ajax({ 
    url:"/api/user", 
    type:"GET", 
    dataType:"json", 
    data:'{"uid":"foobar"}', 
    success:function(data){ 
     console.log("Success!"); 
    }, 
    error:function(data){ 
     console.log("Error!"); 
    } 
}); 

Sadece otomatik jQuery dahildir fonksiyon mockjax, çağırarak mockjax ile alay edebilir harici bir JavaScript dosyasında "mocks.js" deyin ve yapılması gereken tek şey, mockjax kütüphanesini içerir (https://github.com/appendto/jquery-mockjax/ adresinde bulunabilir). Akılda tutulması gereken tek şey, bu sadece tüm XMLHttpRequests değil, jQuery ajax çağrıları alay olacaktır. Bunu yapmak isterseniz, @ bertvh'in tavsiyelerini takip edin ve Sinon.js'yi kullanın.

+1

+1. Sadece kullanmaya başladım ve ekran testi için kukla veriler yanı sıra birim testi için oldukça iyi. Tek sorun, json veri dosyalarının Chrome tarayıcı tarafından önbelleğe alındığıydı. Önbelleği temizleme herhangi bir eski dosya sorunlarını düzeltildi. – Evildonald