在expressionapi中返回时,mongoose中_id的types是错误的

我build立了一个简单的testing(摩卡,应该),我testing我保存的报告和我所得到的一样。 我宁愿使用deep.equal,但由于_id不等于即时通讯卡。

var report = new Report(); describe('GET:id /api/reports', function () { beforeEach(function (done) { report.save(function (err, result) { if (err) return (done(err)); result._id.should.eql(report._id); done(); }); }); afterEach(function (done) { Report.remove().exec().then(function () { done(); }); }); before(function (done) { Report.remove().exec().then(function () { done(); }); }); it('should respond with the same report saved', function (done) { request(app) .get('/api/reports/' + report._id) .expect(200) .expect('Content-Type', /json/) .end(function (err, res) { if (err) return done(err); console.log(JSON.stringify(res.body)); console.log(JSON.stringify(report)); res.body._id.should.equal(report._id); done(); }); }); }); 

我得到的输出是

  {"_id":"55282d42cb39c43c0e4421e1","__v":0} {"__v":0,"_id":"55282d42cb39c43c0e4421e1"} 1) GET:id /api/reports should respond with the same report saved: Uncaught AssertionError: expected '55282d42cb39c43c0e4421e1' to be 55282d42cb39c43c0e4421e1 

如果我反而使用==它工作正常

(res.body._id == report._id).should.equal(true);

我最终想要的是让res(身体)(或者其他事情)来深化平等的初始报告。

假设你是Express路由处理程序的/api/reports/:id使用res.json()发送Report ,问题mongoose文档是“string”。 当一个mongoose文档被string化时,ObjectIds会被转换为string,当parsing出一个对象时,它们不会自动转换回ObjectId。

因此,如果您希望将“原始Report文档与“Express”返回的Report文档“深入平等”,则需要将其提交到相同的“转换过程”。 断言看起来像这样。

 res.body.should.eql(JSON.parse(JSON.stringify(report))); 

希望这对你有用。