ich den folgenden Code verwendet haben:Testing verspricht innerhalb Versprechen
function makeCall(userInfo) {
api.postUser(userInfo).then(response => {
utils.redirect(response.url);
})
// other logic
return somethingElse;
}
Und ich war in der Lage, einen Test zu schreiben, der so aussah:
const successPromise = Promise.resolve({ url: 'successUrl' })
beforeEach(function() {
sinon.stub(api.postUser).returns(successPromise);
}
afterEach(function() {
api.postUser.restore();
}
it "calls API properly and redirects" do
makeCall({});
expect(api.postUser).calledWith(userInfo).toBe(true);
successPromise.then(() => {
expect(utils.redirect.calledWith('successUrl')).toBe(true);
done();
}
emd
Und alles war grün.
Nun hatte ich ein weiteres Versprechen fügen Sie eine weiteren externen Anruf zu tätigen, bevor Sie den api postUser Anruf zu tun, so dass mein Code wie folgt aussieht:
function makeCall(names) {
fetchUserData(names).then(userData => {
return api.postUser(userData).then(response => {
utils.redirect(response.url);
})
})
// other logic
return somethingElse;
}
wo fetchUseData eine Kette von vielen Versprechungen ist, so wie :
function fetchNames(names) {
// some name regions
return Promise.all(names);
}
function fetchUserData(names) {
fetchUsersByNames(names).then(users => {
// For now we just choose first user
{
id: users[0].id,
name: users[0].name,
}
});
}
Und die Tests, die ich hatte, scheitern. Ich versuche zu verstehen, wie ich meine Tests ändern kann, um sicherzustellen, dass ich immer noch teste, dass ich den letzten API-Aufruf richtig ausführe und die Weiterleitung ebenfalls erfolgt. Ich möchte stumm was fetchUserData(names)
, um diesen HTTP-Aufruf zu verhindern.
Sie verwenden nicht richtig Versprechungen. Ihr Code hat keine einzige 'return'-Anweisung, wenn sie mehrere haben sollte (oder zumindest Pfeilfunktionen verwenden sollte, so dass Sie sie nicht brauchen, was Sie nicht tun). Sie beziehen sich auf einen frei schwebenden Code als "Mein Code". Wie nennt man diesen Code? Sollten nicht Ihre Tests es nennen? Sie scheinen ein Ergebnis zu beobachten, nachdem Ihr Code bereits irgendwo anders ausgeführt wurde. – JLRishe
Versuchen Sie, das innere Versprechen (add 'return') zurückzugeben, um eine Versprechenskette zu erstellen. – TiagoLr
@JLRishe aktualisiert. Mein Hauptanliegen ist, wo sollte ich das 'done()' machen oder was soll ich tun, damit die Versprechen niedergeschrieben und ausgewertet werden. –