我正在尝试使用sailjs在mocha系统上执行端到端测试的变体。我想要做的是通过创建用户,然后对该用户执行其他操作来模拟操作程序流程。
我希望能够将我的测试分成单独的文件,这些文件按照与不同操作相关的顺序运行,例如"注册新用户"要做到这一点,我需要能够在测试文件之间传递值。
Mocha包含选项设置--globals <value1, value2, etc>
。以下是文档中的说明:
- globals允许给定逗号分隔的全局[名称]
然而,我一直无法让这个工作。这是我尝试过的。我有一个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:未定义用户
我在这里做错了什么?我无法在网上找到关于如何使用它的描述。
答案 0 :(得分:1)
这似乎对我使用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();
})
});
});
然后我可以访问在注册用户测试之后运行的其他测试文件中的全局电子邮件和令牌变量,例如下面调用my 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();
})
});
});
答案 1 :(得分:1)
你误解了--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
您的测试文件将会看到您的全局。 (我试过了:它有效。)