Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
Javascript Nodejs/Express.js/Body parser单元测试:如何通过中间件测试路由功能_Javascript_Node.js_Unit Testing_Express_Middleware - Fatal编程技术网

Javascript Nodejs/Express.js/Body parser单元测试:如何通过中间件测试路由功能

Javascript Nodejs/Express.js/Body parser单元测试:如何通过中间件测试路由功能,javascript,node.js,unit-testing,express,middleware,Javascript,Node.js,Unit Testing,Express,Middleware,我已经研究这个问题好几天了,但我找不到任何解决办法 对于route类中的每个函数,我有两个中间件 index.js const browser = require('browser-detect'); const detectBrowser = (req,res,next) => { const result = browser(req.headers['user-agent']); console.log(result); if (result) {

我已经研究这个问题好几天了,但我找不到任何解决办法

对于route类中的每个函数,我有两个中间件

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');
       }
    }
};
我想测试的一个简单函数是:

router.get('/', detectBrowser, redirectHome, (req, res) => {
    res.render("login");
});
我计划使用Mocha和Supertest作为框架来测试
router.get(/)
函数,但无论如何都找不到模拟浏览器和会话变量(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();
})
});
});
希望这能帮助某人:)

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();
})
});
});