【问题标题】:Nodejs / Express.js/ Body-parser Unit Test: How to come through middlewares to test the routing functionNodejs / Express.js/ Body-parser 单元测试:如何通过中间件来测试路由功能
【发布时间】:2020-10-26 18:15:00
【问题描述】:

我已经解决这个问题好几天了,但我找不到任何解决方案。

对于路由类中的每个函数,我都有这 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.token、session.firstName、session.lastName、session.检查)。

有人知道吗?

提前谢谢你。

【问题讨论】:

    标签: javascript node.js unit-testing express middleware


    【解决方案1】:

    对于这个问题,我已经找到了解决方案。 对于中间件 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();
    })
    });
    });
    

    希望这会对某人有所帮助:)

    【讨论】:

      猜你喜欢
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-04-06
      相关资源
      最近更新 更多