2014-12-18 5 views
7

Ich verwende die Superajent-Ajax-Bibliothek für eine App, und ich versuche, einige Komponententests dafür zu schreiben. Ich habe eine Klasse bekam, die wie folgt aussieht:Javascript: Ausspionieren mit Jasmine?

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

Wie kann ich einen Jasmin Test schreiben auf dem _this.data = res.body Aufruf auszuspionieren? Das Einrichten eines Spions mit and.callThrough() auf getData funktioniert nicht. Ich möchte nicht wirklich Anruf die URL in Frage; Ich versuche nur zu testen, wenn es Daten bekommt, tut es etwas damit.

Dank

+1

Ich möchte darauf hinweisen, dass der Titel klingt wie eine Frage, die ein unschuldiger junger Agent stellen würde, wenn sie versuchen herauszufinden, was eine Mission von 00 ist. Vermutlich nannten sie ihre Microdrone Jasmine. –

Antwort

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

Antwort Bror ist perfekt funktioniert. Um etwas zu seiner Antwort hinzuzufügen, können Sie wie folgt vorgehen, wenn wir eine weitere superaktive Funktion (wie set) zu der spyOn-Methode hinzufügen müssen.

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

Hier wird die Set-Funktion verwendet, um Header für die Anforderung festzulegen.

+1

Wenn wir mehrere Methoden verketten wie 'get(). Query(). Headers(). Timeout(). End()', wie spionieren wir den innersten "get" Aufruf aus? Erstellen Sie eine Kette wie die, die Sie in der Antwort gezeigt haben? –

+0

Ja, was ist die SpyOn-Syntax hier? – FlavorScape

0

Es gibt eine andere gute Lösung hier, die aus der anonymen Funktion zu abstrakt ist:

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

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

Jetzt können Sie die handleAjax Funktion diskret und mit einfachen Tests testen; und auch stub superagent, da Sie nur eine Methode überprüfen müssen .end() mit einem bestimmten Wert aufgerufen wird.

Anonyme Funktionen sind problematic for other reasons als nur zu testen, so ist dies eine gute refactor

0

Sagen Sie es ein Patch ist, zuerst ein Mock-Patch Rückgabewert machen:

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

dann wieder als Wert von Patch:

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

dann Spion auf der Set-Funktion des "mock" Patch-Objekt:

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