Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 不同测试的不同节点_ENV_Node.js_Mocha.js_Supertest_Superagent - Fatal编程技术网

Node.js 不同测试的不同节点_ENV

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.

我正在用

我想检查我的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.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...