2014-12-18 20 views
7

Bir uygulama için süper ajax kütüphanesini kullanıyorum ve bunun için bazı birim testleri yazmaya çalışıyorum.Javascript: Yasemin ile süper argada casusluk nasıl?

someClass = { 
    getData: function(){ 
    _this = this; 
    superagent.get('/some_url').end(function(res){ 
     if(res.body){ 
     _this.data = res.body 
     } 
    }); 
    }); 
} 

nasıl _this.data = res.body çağrı gözetlemek için bir yasemin testi yazıyorsunuz: Ben şöyle bir sınıf var? getData üzerinde and.callThrough() numaralı casusun ayarlanması çalışmıyor. Söz konusu URL’yi aslında numaralı telefondan aramak istemiyorum; Sadece veri alırsa, onunla bir şey yapıp yapmadığını test etmeye çalışıyorum. Bror cevabı mükemmel çalışıyor

Teşekkür

+1

Bu başlık, bazı masum genç ajanların, 00'ın misyonunun ne olduğunu anlamaya çalıştıklarında sorması gereken bir soru gibi geldiğini belirtmek isterim. Muhtemelen, mikrodron Yasemin adını koydu. –

cevap

2
spyOn(superagent, 'get').and.callFake(function(url) { 
    return { 
    end: function(cb) { 
     //null for no error, and object to mirror how a response would look. 
     cb(null, {body: data}); 
    } 
    } 
}); 
0

. Cevabına bir şey eklemek için, spyOn yöntemine başka bir süper arama işlevi eklememiz gerektiğinde (set gibi), aşağıdaki gibi kullanabilirsiniz.

spyOn(superagent, 'get').and.callFake(function(url) { 
    return { 
     set: function() { 
     return { 
      end: function(cb) { 
      //null for no error, and object to mirror how a response would look. 
      cb(null, {body: data}); 
      } 
     } 
    } 
}); 

Burada, işlev, üstbilgileri isteğe ayarlamak için kullanılır.

+1

"get(). Query(). Headers(). Timeout(). End()' gibi birden çok yöntemi zincirliyorsak, en çok 'get' çağrısı için nasıl casusluk yaparız? Cevapta gösterdiğiniz gibi bir zincir oluşturun? –

+0

evet spyOn sözdizimi burada nedir? – FlavorScape

0

anonim işlevine dışarı soyut etmektir burada başka bir iyi bir çözüm var,:

someClass = { 
    getData: function(){ 
    _this = this; 
    superagent.get('/some_url').end(this.handleAjax); 
    }, 

    handleAjax: function(res){ 
    if(res.body){ 
     _this.data = res.body 
    } 
    } 
} 

Artık Discretely ve basit testlerle handleAjax fonksiyonunu test edebilirsiniz; ve aynı zamanda sadece bir yöntem .end() belirli bir değeri ile çağrılırken kontrol etmek gerektiği gibi superagent. Sonra

this.mockPatchObject = { 
     set:() => { 
     return { 
      end: (cb: any) => { 
      cb(null, {body: 'etc'}); 
      }, 
     }; 
     }, 
    }; 

yama olarak döndürür:

Anonim işlevler sadece bu yüzden bu iyi bir refactor

0

ilk sahte yama dönüş değeri yapın onu yaması Say ise test daha problematic for other reasons şunlardır:

:

this.superagentSpy = spyOn(request,'patch').and.returnValue(this.mockPatchObject); 

ardından "sahte" yama nesnenin kümesi fonksiyonu gözetlemek

this.superagentSetSpy = spyOn(this.mockPatchObject, 'set'); 
İlgili konular