在 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.js
和 b.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
,您的测试文件将看到您的全局。 (我试过了:有效。)
我正在尝试对 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.js
和 b.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
,您的测试文件将看到您的全局。 (我试过了:有效。)