gpt4 book ai didi

node.js - 不同的 NODE_ENV 用于不同的测试

转载 作者:行者123 更新时间:2023-12-03 15:00:16 27 4
gpt4 key购买 nike

我正在使用 supertest 测试我的 API
我想检查我的 CSRF token 保护是否有效,然后在其他测试中禁用它。
为此,我设置了 NODE_ENVtestnot_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);
});
});
测试登录
NODE_ENV 现在正在测试中
process.env.NODE_ENV = 'test';

var app = require("app.js");
var request = require('supertest').agent(app);

var testAccount = {
"login": "test",
"pass": "test"
};

describe('API Admin roads', function() {
before(function (done) {
request
.post('/login')
.send(testAccount)
.end(done);
});

it('/api/admin/groups/', function(done){
request
.get('/api/admin/groups/')
.expect(200, done);
});
});
问题是,只有第一个 process.env.NODE_ENV考虑在内,如果我将其设置为 not_test然后到 test我还会在 not_test模式。

最佳答案

测试可以通过多种方式执行,它们的执行顺序并不总是相同的(例如 mocha --parallel 选项)。
因此,重写一个共享变量,如 process.env并操纵 require缓存它不是解决此问题的可靠方法。这是一个黑客 - 今天它可以工作,但是当您(或您的同事)明天更改代码时,它很容易损坏。
一种更简单、更简洁的方法是从您的 app.js 返回一个 init 函数。文件并获取 app对象作为此函数调用的输出。通过这种方式,您可以向它传递一个 显式 启用/禁用 csrf token 保护的选项:

//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...
这种方法的优点:
  • 不需要特定的执行顺序
  • 没有并发问题
  • 您的应用程序的显式设置
  • 关于node.js - 不同的 NODE_ENV 用于不同的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596061/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com