在MochaJS测试套件中使用--globals变量

Using the --globals variable with MochaJS testing suite

本文关键字:--globals 变量 MochaJS 测试 套件      更新时间:2023-09-26

我正在尝试使用mocha在sailjs系统上进行端到端测试。我想做的是通过创建一个用户,然后与该用户一起执行其他操作来模拟动作程序流。

我希望能够将我的测试分离成单独的文件,这些文件按照不同操作的顺序运行,例如"注册新用户"等。要做到这一点,我需要能够在测试文件之间传递值。

Mocha包含一个选项设置--globals <value1, value2, etc>。以下是文档中的描述:

--globals允许给定的逗号分隔的global[名称]

然而,我一直无法让它发挥作用。这是我试过的。我有一个bootstrap.test.js文件,它在操作之前和之后做基本的操作,启动和停止航行:

var Sails = require('sails'),
  sails;
before(function(done) {
  Sails.lift({
    log: {
        level: 'error'
    }
  }, function(err, server) {
    sails = server;
    if (err) return done(err);
    // here you can load fixtures, etc.
    done(err, sails);
  });
});
after(function(done) {
  // here you can clear fixtures, etc.
  sails.lower(done);
});

然后假设我有两个测试文件a.jsb.js,它们将连续运行,并且为了测试目的只包含很少的内容:

a.js:

var user = 'some user';

b.js:

console.log( user );

如果我运行mocha --globals,我会得到错误:

ReferenceError:用户未定义

我在这里做错了什么?我在网上找不到关于如何使用它的描述。

您误解了--globals的用途。当您使用--check-leaks时,可以使用它。--check-leaks选项检查测试是否将变量泄漏到全局空间中。考虑一下这个套件:

it("one", function () {
    foo = 1;
});

如果你用mocha --check-leaks运行它,你会得到一个错误,因为测试会创建一个新的foo全局。您可以使用mocha --check-leaks --globals foo防止该错误。在大型项目中,可能存在被认为是正常的泄漏,因此使用--globals选项可以关闭那些正常情况下的错误。

现在,你如何才能实现你想要做的事情?如果使用var,则无法创建全局变量。您的a.js必须是:

user = 'some user';

此外,默认情况下,Mocha在加载测试文件时不保证订单。您可以使用--sort来保证首先加载a.js,但随后您必须使用一个能够保证此顺序的名称。我更喜欢使用--require a,它告诉Mocha在开始读取测试文件之前需要a模块。您的模块可以称为z,并且仍然会在任何测试文件之前加载。无论如何,通过删除var并使用--require,您的测试文件将看到您的全局。(我试过了:它有效。(

这似乎对我使用sailsjs有效(我认为有更好的方法可以做到这一点(,我运行的第一个测试之一是注册用户:

describe('#Should register test user', function () {
    it('should register user', function (done) {
        request(sails.hooks.http.app)
            .post('/auth/registertest')
            .send({
                "email": "email@foo.com.au",
                "password": "foo",
                "firstname": "foo",
                "lastname": "foo",
                "location": {
                    "name": "foo",
                    "id": "54d733795ed3f5140b0a761b"
                }
            })
            .expect(200).end(function (err, res) {
                if (err) return done(err);
                global.email = "email@tpg.com.au";
                global.token = res.body.token;
                done();
            })
    });
});

然后,我就可以访问注册用户测试后运行的其他测试文件中的全局电子邮件和令牌变量,例如下面的调用我的api并使用Authorization标头中的全局令牌变量。

describe('#auth access to users bunches', function () {
    it('should get 200', function (done) {
        request(sails.hooks.http.app)
            .get('/bunch/byuser')
            .set('Authorization', 'bearer ' + token)
            .expect(200).end(function (err, res) {
                if (err) return done(err);
                done();
            })
    });
});