我已经构建了一个带身份验证的Web服务器。这意味着当用户发出请求(登录,注册和注销除外)时,用户必须提供令牌。这一切似乎运作良好,我已经在前端工作了大约2周,已经没有太多问题了。如果令牌有效(在Redis商店中),它要么完成api请求,要么返回未经授权的用户'消息。
问题是,我现在决定使用mocha彻底测试我的所有服务器端代码。
我目前能想到的唯一方法是:
const createUser = function(data) {
return (
chai.request(server_addr)
.post('auth/register')
.set('content-type', 'application/x-www-form-urlencoded')
.type('form')
.send('userName=' + data.name)
.send('email=' + data.email)
.send('password=' + data.password)
);
}
before((done) => {
var users = [];
for (var i = 0; i < num_users; i++) {
users.push({
name: 'user_' + i,
email: 'test_' + i + '@gmail.com',
password: 'password_' + i
});
}
Promise.all(users.map(function(user) {
return createUser(user);
}))
.then(function(r) {
//Save the tokens some how, either in an array or otherwise.
done();
})
});
&#13;
然后存储为每个注册用户返回的令牌。问题是,使用当前的方法,服务器实际上只是超时,只创建3个用户。这也意味着我的测试必须遵循一个命令,例如:user_1必须登录,然后他可以GET,POST等,因此这意味着我将寄存器测试拖到几个文件。
我确定这不是最佳的做事方式吗?
我玩弄了两个想法:
创建一些我从未注销的测试用户,因此他们的令牌有效,直到机器死亡。这个问题是我必须在某个地方硬编码这些令牌,无论是在代码中还是在环境变量中,如果我想尝试100个用户,它也不具备可扩展性。
我的第二个想法是在环境测试时关闭身份验证。这个问题是在我当前的控制器代码中的几个地方,我有像req.user._id
这样的代码,我通过解析Redis商店中的令牌来获取用户。我不想改变生产代码以满足我的测试。
有没有其他人可以选择其中任何一种方法,目前我倾向于选项1,但我期待听到社区的回应。
谢谢,
答案 0 :(得分:1)
你的第一个选择是解决这个问题的理想方式。
创建一些我从未注销的测试用户,因此他们的令牌有效,直到机器死亡。
这是要走的路。更具体地说:
在开始测试之前,创建一个seeds the database带有一些虚拟数据的脚本。理想情况下,您将创建一些假定已注册的用户。
您当然应该测试一个注册流程,在那里您自己注册一个全新的用户并测试它是否有效;避免将此用户用于其他测试。相反,请使用在初始播种中添加的其中一个用户。
创建一个模块,用于导出有关您播种数据库的用户的数据。这样,您就可以避免在测试中到处硬编码/重复用户及其令牌。
当您完成测试后,请运行另一个清除数据库的脚本。
理想情况下,针对您在开始测试之前设置的test数据库运行测试,并在测试后将其拆除。
至于你的第二个选择:
我的第二个想法是在环境测试时关闭身份验证...
我会避免这种情况。您应该按原样测试代码。您还需要彻底测试您的身份验证系统。
使用NODE_ENV=test
条件来改变流程/或重定向,例如:
在测试时尽量不要滥用它。使用它是出于必要但不方便。
问题在于,使用当前的方法,服务器实际上只是超时,只创建了3个用户
我猜测你需要调试自己的代码问题。我将答案集中在您的测试最佳实践问题上。