具有身份验证的服务器,使用mocha进行测试,设置初始用户会导致服务器超时

时间:2018-03-07 17:01:23

标签: unit-testing mongoose automated-tests mocha

我已经构建了一个带身份验证的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;
&#13;
&#13;

然后存储为每个注册用户返回的令牌。问题是,使用当前的方法,服务器实际上只是超时,只创建3个用户。这也意味着我的测试必须遵循一个命令,例如:user_1必须登录,然后他可以GET,POST等,因此这意味着我将寄存器测试拖到几个文件。

我确定这不是最佳的做事方式吗?

我玩弄了两个想法:

  1. 创建一些我从未注销的测试用户,因此他们的令牌有效,直到机器死亡。这个问题是我必须在某个地方硬编码这些令牌,无论是在代码中还是在环境变量中,如果我想尝试100个用户,它也不具备可扩展性。

  2. 我的第二个想法是在环境测试时关闭身份验证。这个问题是在我当前的控制器代码中的几个地方,我有像req.user._id这样的代码,我通过解析Redis商店中的令牌来获取用户。我不想改变生产代码以满足我的测试。

  3. 有没有其他人可以选择其中任何一种方法,目前我倾向于选项1,但我期待听到社区的回应。

    谢谢,

1 个答案:

答案 0 :(得分:1)

你的第一个选择是解决这个问题的理想方式。

  

创建一些我从未注销的测试用户,因此他们的令牌有效,直到机器死亡。

这是要走的路。更具体地说:

  • 在开始测试之前,创建一个seeds the database带有一些虚拟数据的脚本。理想情况下,您将创建一些假定已注册的用户。

  • 您当然应该测试一个注册流程,在那里您自己注册一个全新的用户并测试它是否有效;避免将此用户用于其他测试。相反,请使用在初始播种中添加的其中一个用户。

  • 创建一个模块,用于导出有关您播种数据库的用户的数据。这样,您就可以避免在测试中到处硬编码/重复用户及其令牌。

  • 当您完成测试后,请运行另一个清除数据库的脚本。

理想情况下,针对您在开始测试之前设置的test数据库运行测试,并在测试后将其拆除。

至于你的第二个选择:

  

我的第二个想法是在环境测试时关闭身份验证...

我会避免这种情况。您应该按原样测试代码。您还需要彻底测试您的身份验证系统。

使用NODE_ENV=test条件来改变流程/或重定向,例如:

  • 在何处发送用户注册电子邮件。
  • 拨打昂贵的按次付费外部服务等。

在测试时尽量不要滥用它。使用它是出于必要但不方便。

  

问题在于,使用当前的方法,服务器实际上只是超时,只创建了3个用户

我猜测你需要调试自己的代码问题。我将答案集中在您的测试最佳实践问题上。