2017-11-13 18 views
0

私は従業員の文書をIDで見つけ、参照されたmanagerinterviewerのフィールドを埋め込む静的関数を持つマングースモデルを持っています。単体テスト:母集団を使用するときにモンゴーズコードを模擬する方法は?

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

私はそれが移入チェーンが含まれていない場合に、この機能をテストする方法を理解しますが、移入部分はループのための私を投げています。

具体的には、私は、一致するレコードが見つからなかったときNotFoundError例外がスローされることをテストしようとしていますが、私は.populate()が戻り値で呼び出すことができるようにfindById方法を模擬する方法は混乱しています。私は.populate()チェーンなしでこのメソッドをテストしていた場合

、私は

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

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

しかし移入が関与しているときに、このアプローチは、もちろん、動作しないような何かをするだろう。私は嘲笑されたクエリやそれに類するものを返すべきだと思いますが、そのモックで再度作成したり、それを約束として解決できるようにする必要もあります。

このコードのテストを作成するにはどうすればよいですか?私の機能は異なって構造化されるべきですか?

答えて

0

これは私が予想していたよりも簡単に終わりました。.exec()を最終.populate().then()の間で追加する必要がありました。

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