2017-08-11 3 views
2

mit Asynchron-Funktion aufruft, wie diese Funktion testen:Wie eine Funktion zu testen, die Jasmine

var self = this; 
self.someVariable = "initial value"; 
self.test = function() { 
    self.functionWhichReturnsPromise().then(function() { 
    self.someVariable = "new value"; 
    }); 
} 

I Testfall haben wie unten, ich weiß, es ist falsch, weil vor Versprechen gelöst wird, wird die assert-Anweisung sein ausgeführt von Jasmin:

it("should test the function test", function (done) { 
    var abc = new ABC(); 
    abc.test(); 
    expect(abc.someVariable).toBe('new value'); 
}); 

Beachten Sie, dass ich SetTimeout() oder keine Schlafmethoden verwenden möchte.

Antwort

4

Zwei Dinge, müssen Sie Ihre test Funktion return das Versprechen und Sie benötigen einen Pfeil Funktion oder .bind der Rückruf zu der übergeordneten Funktion verwenden (da sonst die this in this.someVariable an die Callback-Funktion beziehen):

this.test = function() { 
    return this.functionWhichReturnsPromise().then(() => { 
    this.someVariable = "new value"; 
    }); 
} 

oder

this.test = function() { 
    return this.functionWhichReturnsPromise().then(function() { 
    this.someVariable = "new value"; 
    }.bind(this)); 
} 

Dann in Ihrem Test können Sie tun:

it("should test the function test", function (done) { 
    var abc = new ABC(); 
    abc.test().then(function() { 
     expect(abc.someVariable).toBe('new value'); 
     done(); 
    }); 
}); 
+1

ich die Frage bearbeitet haben, so das einzige, was noch Versprechen zurückzukehren, von 'test' Funktion. Angenommen, ich kann die 'test'-Funktion nicht bearbeiten, um eine Versprechung zurückzugeben, gibt es dann noch eine Möglichkeit, die Variable' someVariable' zu ​​testen? – Mumzee

+0

Wenn Sie das Versprechen nicht zurückgeben können, gibt es keine Möglichkeit, dies genau zu testen, ohne ein 'setTimeout' –

+0

Forgot to 'done' aufzurufen. –

0

Jetzt sind async und await in Jasmin verfügbar. Sie können sie verwenden, um Ihre asynchrone Funktion zu testen, die ein Versprechen oder eine beobachtbare Funktion ist.

it("should test the function test", async (done) => { 
    var abc = new ABC(); 
    abc.test(); 
    expect(await abc.someVariable).toBe('new value'); // await will wait until abc.someVariable resolved or rejected 
}); 

Ich habe in meinem Winkel 4 Anwendungstest async und await benutzen und es sollte für Sie arbeitet.

1

Sie können nur die Funktion ausspionieren, die das Versprechen zurückgibt.

describe('when test method', function() { 
    beforeEach(function() { 
    this.promiseResult = Math.random(); 
    spyOn(ABC.prototype, 'functionWhichReturnsPromise') 
     .and.returnValue(Promise.resolve(this.promiseResult)); 
    }) 

    it('then should change someVariable with the result of functionWhichReturnsPromise', function() { 
    var abc = new ABC(); 
    abc.test(); 
    expect(abc.someVariable).toBe(this.promiseResult); 
    }); 
}); 

Keine Notwendigkeit, das Versprechen zu warten, in diesem Gerät zu testen, Sie sind nicht daran interessiert, wie functionWhichReturnsPromise tatsächlich funktioniert, Sie wollen nur sehen, dass das Ergebnis des Aufrufs functionWhichReturnsPromise somevariable Wert aktualisiert.

Viel Spaß und Glück

Verwandte Themen