2017-11-13 7 views
0

Ich habe ein Mungo-Modell mit einer statischen Funktion, die ein Mitarbeiterdokument nach ID findet und die referenzierten Felder manager und interviewer füllt.Komponententest: Wie mongoose Code zu verspotten, wenn Sie populate verwenden?

employeeSchema.statics.findAndPopulateById = function(id) { 
    return this.findById(id) 
    .populate("manager", "firstname lastname email") 
    .populate("interviewer", "email") 
    .then(employee => { 
     if (!employee) { 
     throw new errors.NotFoundError(); 
     } 
     return employee; 
    }); 
} 

Ich verstehe, wie diese Funktion zu testen, wenn es nicht die bevölKette enthält, aber der Bestücken-Teil mich für eine Schleife zu werfen.

Insbesondere Ich versuche, zu testen, ob die NotFoundError Ausnahme ausgelöst wird, wenn kein passender Datensatz gefunden wird, aber ich bin verwirrt, wie die findById Methode zu verspotten, so dass .populate() auf dem Rückgabewert bezeichnet werden.

Wenn ich diese Methode zu testen wurde ohne die .populate() Kette, würde ich so etwas wie

let findByIdMock = sandbox.stub(Employee, 'findById'); 
findByIdMock.resolves(null); 

return expect(Employee.findAndPopulateById('123')).to.be.rejectedWith(errors.NotFoundError); 

tut Aber dieser Ansatz ist natürlich nicht funktioniert, wenn bevöl beteiligt ist. Ich denke, ich sollte eine verspottete Frage oder etwas Ähnliches zurückgeben, aber ich muss auch in der Lage sein, wieder auf diesen Spott zu antworten oder ihn als Versprechen zu lösen.

Wie schreibe ich einen Test für diesen Code? Sollte meine Funktion anders strukturiert sein?

Antwort

0

In Ordnung das endete als einfacher als ich erwartet hatte, ich musste nur einen Anruf zu .exec() zwischen meinem letzten .populate() und hinzufügen, um den Test unten arbeiten zu lassen.

it("should throw not found exception if employee doesn't exist",() => { 
    const mockQuery = { 
    exec: sinon.stub().resolves(null) 
    } 
    mockQuery.populate = sinon.stub().returns(mockQuery); 

    let findById = sandbox.stub(Employee, 'findById'); 
    findById.withArgs(mockId).returns(mockQuery); 

    return expect(Employee.findAndPopulateById(mockId)).to.be.rejectedWith(errors.NotFoundError); 
}); 
Verwandte Themen