【发布时间】:2020-04-27 10:46:18
【问题描述】:
我正在为 Express CRUD 应用程序编写测试。该应用程序有一个帐户恢复路线,该路线接受正文中带有电子邮件的 POST 请求。它使用给定的电子邮件搜索用户,更改其密码,然后使用新密码发送电子邮件并返回 200。
所以我想编写一个测试来检查用户的密码是否确实已更改。
这是我的尝试:
首先,我使用 factory-girl 库创建了一个用户工厂。
// factory.js file
const { factory } = require('factory-girl');
const User = require('../../models/User');
factory.define('User', User, {
email: factory.sequence('User.email', n => `fakeuser${n}@mail.com`),
name: factory.chance('name'),
password: factory.chance('word')
});
module.exports = factory;
很好。然后我写了测试:
// One test inside my test suite
it('should return 200 and change user\'s password', async () => {
const user = await factory.create('User');
const oldPassword = user.password;
const response = await request(app)
.post(endpoint)
.send({ email: user.email });
const passwordChanged = oldPassword !== user.password;
expect(response.status).toBe(200);
expect(passwordChanged).toBe(true);
await user.remove();
});
但是passwordChanged 总是被评估为false,因为user.password 根本没有改变。我的意思是,在数据库上,它发生了变化(该方法正常工作),但在我的测试中,用户对象在请求后没有更新。
换句话说,我在这里要测试的是数据库中文档的状态,而不仅仅是请求返回的内容。关于如何实现这一点的任何建议?
【问题讨论】:
-
你应该在测试中模拟数据库。
标签: javascript node.js mongodb express jestjs