2016-08-04 33 views
1

ich die unten Funktion haben, die ein Versprechen Objekt aufruftTesting ein Versprechen Objekt, das eine verschachtelte Rückruf enthält

export const project_list = function(data,res){ 
    return db.any(queries.ProjectList) 
    .then(function(results){ 
     let newResults = project_list_cleaner(results) 
     res(null,newResults) 
    }) 
    .catch(function(err){ 
     res(err) 
    }) 
} 

Ich versuche, die Funktion wie die unter

it('should retrieve a list',function(){ 
    return expect(project_list(data,res)).to.eventually.be.false 
    }) 

dies erhöht ein testen Fehler, weil das Versprechen-Objekt tatsächlich nichts zurückgibt. Es führt den res Rückruf aus.

Gibt es trotzdem, um zu testen, ob das Versprechen-Objekt den Rückruf ausführt?

Antwort

1

Die Tatsache, dass die obige Funktion ein Promise zurückgibt, spielt für die Signatur keine Rolle. Die Tatsache, dass Sie einen Callback an ihn weitergeben, macht die Promise-Sache nicht nutzbar.

Lösung 1: Refactoring Ihre Funktion

Machen Sie Ihre Funktion ein Versprechen zurückzukehren und das ist es. Kein Rückruf erforderlich.

export const project_list = function(data){ 
    return db.any(queries.ProjectList) 
    .then(function(results){ 
     return project_list_cleaner(results) 
    }); 
} 

Der Test wird dann sein:

it('should retrieve a list',function(){ 
    return expect(project_list(data)).to.eventually.be.false 
}) 

Lösung 2: Sie Refactoring nicht die Funktion Bei dieser Lösung

Versprechen ignorieren (aber Sie sollten wirklich!) Und arbeite als Versprechen gab es nie.

+0

Also wäre eine Lösung zu diesem sein, dass ich eine Funktion höherer Ordnung habe, die die Funktion project_list aufruft. Die Funktion höherer Ordnung würde res auf der Grundlage von project_list auflösen oder werfen aufrufen? – Kannaj

+0

Ja. Wenn Sie Promises verwenden können, würde ich sagen, dass Sie die Callback-Funktion so hoch wie möglich schalten und die Kontrolle über den asynchronen Workflow mit Promises beibehalten können, wenn Sie können. – MarcoL

+0

Eine Funktion höherer Ordnung gemacht, um 'res' zu behandeln. danke – Kannaj