Node.js 不同测试的不同节点_ENV
我正在用 我想检查我的CSRF令牌保护是否有效,然后在其他测试中禁用它 为此,我将Node.js 不同测试的不同节点_ENV,node.js,mocha.js,supertest,superagent,Node.js,Mocha.js,Supertest,Superagent,我正在用 我想检查我的CSRF令牌保护是否有效,然后在其他测试中禁用它 为此,我将NODE\u ENV设置为test或not\u test app.js var csrf = require('csurf'); var app = express(); if (process.env.NODE_ENV !== 'test') { app.use(csrf({ cookie: true })); app.use(function(req, res, next) { res.
NODE\u ENV
设置为test
或not\u test
app.js
var csrf = require('csurf');
var app = express();
if (process.env.NODE_ENV !== 'test') {
app.use(csrf({ cookie: true }));
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
return next();
});
}
测试CSRF
process.env.NODE_ENV = 'not_test';
var app = require("app.js");
var request = require('supertest')(app);
var testAccount = {
"login": "test",
"pass": "test"
};
describe('CSRF protection', function() {
it('On /login', function(done){
request
.post('/login')
.send(testAccount)
.expect(403, done);
});
});
测试登录
节点_ENV现在处于测试状态
问题是,只考虑了第一个
进程.env.NODE_env
,如果我将其设置为not_test
,然后设置为test
,我仍将处于not_test
模式。测试可以以多种方式执行,并且它们的执行顺序并不总是相同(例如,选项)
因此,重写共享变量(如process.env
)并操作需要缓存,这不是解决此问题的可靠方法。这是一个黑客:今天它可以工作,但当你(或你的同事)明天更改代码时,它会很容易崩溃
一种更简单、更简洁的方法是从app.js
文件返回一个init函数,并获取app
对象作为此函数调用的输出。通过这种方式,您可以向其传递一个显式选项,以启用/禁用csrf令牌保护:
//app.js
module.exports = function appSetup(opts) {
var csrf = require('csurf');
var app = express();
if (opts.csrfEnabled) {
app.use(csrf({ cookie: true }));
app.use(function(req, res, next) {
res.cookie('XSRF-TOKEN', req.csrfToken());
return next();
});
}
// more express handlers ...
// app.use(...)
return app;
}
然后,在没有csrf的测试中,只需禁用它:
var app = require("app.js");
var request = require('supertest')(app({csrfEnabled: false}));
并在需要时启用:
var app = require("app.js");
var request = require('supertest')(app({csrfEnabled: true}));
显然,您需要更新应用程序启动代码,例如bin/start.js
:
var app = require('../app')({csrfEnabled: true});
var server = http.createServer(app);
// and so on...
这种方法的优点:
- 不需要特定的执行命令
- 没有并发问题
- 应用程序的显式设置
嘿,为什么不在before函数和after函数中更改process.env.NODE_env?@itai因为process.env.NODE_env
需要在app.js
作为测试NODE_env!='测试“
是在app.js
中完成的,我有一个想法,但我自己从未尝试过。不确定它是否好。可能试图在描述范围内要求(我知道不建议在真正的web服务器中使用它,但可能它可以工作,并且对于这个测试来说足够好)-它可能会写一个快照?同样的问题,添加console.log(“ENV:+process.ENV.NODE\u ENV”)仅显示一行(尽管运行的是来自2个不同文件的2个测试)。我猜require('app.js')代码>保存在缓存中delete require.cache[require.resolve(“app.js”)]
使其工作!!!
var app = require('../app')({csrfEnabled: true});
var server = http.createServer(app);
// and so on...