代码之家  ›  专栏  ›  技术社区  ›  SwimmingG

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

  •  1
  • SwimmingG  · 技术社区  · 7 年前

    我已经构建了一个具有身份验证的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();
            })
          });

    然后存储为每个注册用户返回的令牌。问题是,使用当前的方法,服务器实际上只是超时,只创建了3个用户。这也意味着我的测试必须遵循一个顺序,例如:user\u 1必须登录,然后才能获取、发布等,因此,这意味着我正在将注册测试拖到几个文件中。

    我肯定这不是做事情的最佳方式?

    我想出了两个主意:

    1. 创建一些我从未注销过的测试用户,因此他们的令牌在机器死机之前是有效的。这样做的问题是,我必须在某个地方硬编码这些令牌,无论是在代码中还是在环境变量中,如果我想尝试使用100个用户,它的可伸缩性也不太好。

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

    是否还有其他人可以选择这两种方法中的任何一种,目前我倾向于选择1,但我期待听到社区的回应。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   nicholaswmin    7 年前

    您的第一个选择是实现这一目标的理想方式。

    创建一些我从未注销过的测试用户,因此他们的令牌在机器死机之前是有效的。

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

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

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

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

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

    理想情况下,根据 test 在开始测试之前设置的数据库,以及在测试之后拆除的数据库。

    现在,关于第二个选项:

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

    我会避免这样。您应该按原样测试代码。您希望彻底测试您的身份验证系统,这也是非常合理的。

    使用 NODE_ENV=test 更改流/或重定向的条件,如:

    • 发送用户注册电子邮件的位置。
    • 呼叫昂贵的按次付费外部服务等。

    测试时不要滥用此功能。使用它是为了必要,但不是为了方便。

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

    我猜这是一个需要自己调试的代码问题。我的回答集中在您的测试最佳实践问题上。