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

Server with authentication, testing using mocha, setting up the initial users causes the server to timeout

我已经构建了一个带有身份验证的网络服务器。这意味着当用户发出请求(登录、注册和注销除外)时,用户必须提供令牌。一切似乎都运行良好,我已经在前端使用它大约 2 周了,没有出现很多问题。如果令牌有效(在 Redis 存储中),它会完成 api 请求,或者 returns 一条 'unauthorised user' 消息。

问题是,我现在决定开始使用 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();
        })
      });

然后存储为每个注册用户返回的令牌。问题在于,使用当前方法,服务器实际上只是超时,只创建了 3 个用户。这也意味着我的测试必须遵循一个顺序,例如:user_1 必须登录然后他才能获取,POST 等等,因此这意味着我在寄存器周围拖来拖去测试几个文件。

我确定这不是最佳的处理方式?

我想了两个主意:

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

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

对于这两种方法,是否还有其他人有任何替代方案,目前我倾向于选项 1,但我期待听到社区的回应。

谢谢,

您的第一个选择是解决此问题的理想方法。

Create a few test users that I just never sign out and therefore their tokens are valid, until the machine dies.

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

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

  • 当然,您也应该测试注册流程,您自己注册一个全新的用户并测试它是否有效;避免使用此用户进行其他测试。相反,使用在初始种子设定中添加的用户之一。

  • 创建一个模块,导出有关您为数据库设置种子的用户的数据。这样你就可以避免 hardcoding/repeating 你的用户和他们的令牌在你的测试中无处不在。

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

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

现在你的第二个选择:

The second thought I had would be to turn off the authentication when the environment is in test...

我会避免这种情况。您应该按原样测试您的代码。您想要彻底测试您的身份验证系统也是完全有道理的。

使用 NODE_ENV=test 条件来改变 flow/or 重定向,例如:

  • 在哪里发送用户注册电子邮件。
  • 调用昂贵的 pay-per-call 外部服务等

测试时尽量不要滥用这个。必要时使用它,而不是为了方便。

The problem is that with the current approach, the server actually just times out, creating just 3 users

我猜这是一个代码问题,您需要自己调试。我已将我的回答重点放在您的测试 best-practices 问题上。