Nodejs / Express.js/ Body-parser Unit Test: 如何通过中间件来测试路由功能
Nodejs / Express.js/ Body-parser Unit Test: How to come through middlewares to test the routing function
我已经研究了好几天这个问题,但找不到任何解决方案。
对于我在路由中的每个函数 class 我有这 2 个中间件
index.js
const browser = require('browser-detect');
const detectBrowser = (req,res,next) => {
const result = browser(req.headers['user-agent']);
console.log(result);
if (result) {
if (result.name === 'chrome') {
console.log('Browser: '+result.name+ ' OK!');
next();
} else if (result.name=== 'firefox') {
console.log('Browser: '+result.name+ ' OK!');
next();
} else {
res.render('browser-response');
}
}
};
const redirectHome = (req,res,next) => {
if(req.session.token && req.session.firstName && req.session.lastName) {
if (!req.session.checked) {
res.redirect('/term-of-service');
}
else {
res.redirect('/index');
}
} else {
next();
}
};
我想测试的一个简单函数是:
router.get('/', detectBrowser, redirectHome, (req, res) => {
res.render("login");
});
我打算使用Mocha和Supertest作为框架来测试router.get(/)
功能,但是无论如何都找不到模拟浏览器和session的变量(session.token,session.firstName, session.lastName, session.checked).
有人对此有想法吗?
提前致谢。
对于这个问题,我已经找到了解决方案。
对于中间件 detectBrowser 我们只需要添加
} else if (result.name=== 'node') { next(); }
因为我们在节点环境中工作,所以这些代码行将使测试文件通过中间件。
对于第二个中间件,我们只需要为测试提供存根会话信息。下面是一个例子:
const route = require ("../../routes/index");
const request = require("supertest");
const express = require("express");
const bodyParser = require('body-parser');
const chai = require('chai');
const expect = chai.expect;
//create app with valid credentials (not yet accept term of service )
let mockingLoggedIn;
//setup mocking session
mockingLoggedIn = express();
mockingLoggedIn.use(express.urlencoded({extended: false}));
mockingLoggedIn.set('view engine', 'ejs');
mockingLoggedIn.use(bodyParser.json());
mockingLoggedIn.use(bodyParser.urlencoded({extended: true}));
// lets stub session middleware
mockingLoggedIn.use(function (req, res, next) {
req.session = {};
next();
});
//provide a fake login
mockingLoggedIn.get('*', function (req, res, next) {
// and provide some accessToken value
req.session.token = "test";
req.session.firstName= 'test';
req.session.lastName = 'test';
req.session.checked = false;
next()
});
mockingLoggedIn.use(route);
在测试中,我们只需要使用存根应用程序向路由发出请求。例如:
describe("Testing / route and /login route works", () => {
it('testing index route: GET / should return status 200 and render login site',
(done)=> {
request(mockingLoggedIn) // request an app with stubbed credentials
.get("/")
.expect("Content-Type", "text/html; charset=utf-8")
.expect(200)
.end(function (err,res) {
expect(err).to.be.null;
done();
})
});
});
希望这会对某人有所帮助:)
我已经研究了好几天这个问题,但找不到任何解决方案。
对于我在路由中的每个函数 class 我有这 2 个中间件
index.js
const browser = require('browser-detect');
const detectBrowser = (req,res,next) => {
const result = browser(req.headers['user-agent']);
console.log(result);
if (result) {
if (result.name === 'chrome') {
console.log('Browser: '+result.name+ ' OK!');
next();
} else if (result.name=== 'firefox') {
console.log('Browser: '+result.name+ ' OK!');
next();
} else {
res.render('browser-response');
}
}
};
const redirectHome = (req,res,next) => {
if(req.session.token && req.session.firstName && req.session.lastName) {
if (!req.session.checked) {
res.redirect('/term-of-service');
}
else {
res.redirect('/index');
}
} else {
next();
}
};
我想测试的一个简单函数是:
router.get('/', detectBrowser, redirectHome, (req, res) => {
res.render("login");
});
我打算使用Mocha和Supertest作为框架来测试router.get(/)
功能,但是无论如何都找不到模拟浏览器和session的变量(session.token,session.firstName, session.lastName, session.checked).
有人对此有想法吗?
提前致谢。
对于这个问题,我已经找到了解决方案。 对于中间件 detectBrowser 我们只需要添加
} else if (result.name=== 'node') { next(); }
因为我们在节点环境中工作,所以这些代码行将使测试文件通过中间件。
对于第二个中间件,我们只需要为测试提供存根会话信息。下面是一个例子:
const route = require ("../../routes/index");
const request = require("supertest");
const express = require("express");
const bodyParser = require('body-parser');
const chai = require('chai');
const expect = chai.expect;
//create app with valid credentials (not yet accept term of service )
let mockingLoggedIn;
//setup mocking session
mockingLoggedIn = express();
mockingLoggedIn.use(express.urlencoded({extended: false}));
mockingLoggedIn.set('view engine', 'ejs');
mockingLoggedIn.use(bodyParser.json());
mockingLoggedIn.use(bodyParser.urlencoded({extended: true}));
// lets stub session middleware
mockingLoggedIn.use(function (req, res, next) {
req.session = {};
next();
});
//provide a fake login
mockingLoggedIn.get('*', function (req, res, next) {
// and provide some accessToken value
req.session.token = "test";
req.session.firstName= 'test';
req.session.lastName = 'test';
req.session.checked = false;
next()
});
mockingLoggedIn.use(route);
在测试中,我们只需要使用存根应用程序向路由发出请求。例如:
describe("Testing / route and /login route works", () => {
it('testing index route: GET / should return status 200 and render login site',
(done)=> {
request(mockingLoggedIn) // request an app with stubbed credentials
.get("/")
.expect("Content-Type", "text/html; charset=utf-8")
.expect(200)
.end(function (err,res) {
expect(err).to.be.null;
done();
})
});
});
希望这会对某人有所帮助:)