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

Using the --globals variable with MochaJS testing suite

我正在尝试对 sailjs system using mocha 进行 end-to-end 测试的变体。我想做的是通过创建用户等操作来模拟操作程序流,然后对该用户执行其他操作。

我希望能够将我的测试分成单独的文件,运行 以便与不同的操作相关,例如 "register new user" 等。为此,我需要能够在测试文件之间传递值。

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

--globals allow the given comma-delimited global [names]

但是,我无法让它工作。这是我试过的。我有一个 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: user is not defined

我在这里做错了什么?我一直无法在网络上的任何地方找到关于如何使用它的描述。

这似乎对我使用 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 并使用全局令牌变量在授权中 header.

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();
            })
    });
});

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

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,您的测试文件将看到您的全局。 (我试过了:有效。)