首页 > 解决方案 > 为什么我的 expect().to.have.property() 传递,即使属性不存在?

问题描述

我正在尝试编写我的 node.js api 的测试,但在尝试测试属性时遇到了问题。我的应用程序正在使用猫鼬。我正在使用以下方法从 mongodb 中选择数据:

User.findById(req.params.id).select('-refresh_token -password -_id');

查询的响应是:

{ 
    login: 'asd', 
    email: 'asd@example.com', 
    role: 'user', 
    __v: 0 
}

在我的测试文件中,我使用 mocha 和 chai 编写集成测试,并且测试结构如下:

let response = await UsersController.getUser(req);
console.log(response._id);
expect(response).to.be.a('object');
expect(response).to.have.property('_id');

UsersController.getUser(req)返回查询的结果,所以我希望它没有_id属性。当我尝试控制台记录它时,我得到undefined了,但我的测试通过了,没有任何问题。当我控制台记录整个响应时,它似乎没有_id属性(如预期的那样)。

当我测试另一个肯定不在我的响应中的属性时(例如,对于 property asdasdas),测试失败。

编辑

当我添加expect(response).to.not.have.property('_id')我的测试失败。

标签: node.jsmongodbmocha.jschai

解决方案


我的问题似乎与 Mongoose 的Document课程有关。当我更改UsersController.getUser(req)UsersController.getUser(req).toJSON()一切正常并且测试失败时。

我不确定这种行为的原因是什么。似乎Document类实例(我的响应)可能以某种方式具有_id字段,但我无法访问它,因为它在我的查询中被取消选择,但是当我使用toJSON()它时,我得到了我正在寻找的对象,然后它就没有_id字段了。


推荐阅读