首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将未直接传递给调用函数的函数存根?

如何将未直接传递给调用函数的函数存根?
EN

Stack Overflow用户
提问于 2019-05-30 07:36:00
回答 1查看 554关注 0票数 0

我有一个快速的应用程序与API端点使用JWT令牌安全。我有一个方法可以验证接收到的令牌。

代码语言:javascript
复制
// authentication.js

import jwt from 'jsonwebtoken';
import Settings from '../settings';

const AuthenticationMiddleware = {
    verifyToken: (req, res, next) => {
        const token = req.headers['x-access-token'];
        if (!token) {
            const msg = 'Include a valid token in the x-access-token header';
            return res.status(422).json({ 
                error: 'No token provided',
                msg 
            });
        }
        try {
            req.user = jwt.verify(token, Settings.jwtSecret);
            req.token = token;
            return next();
        }
        catch (e) {
            return res.status(422).json({ error: 'Invalid token' });
        }
    }
};

export default AuthenticationMiddleware;

当我在包含令牌头的情况下从postman调用API端点时,这可以很好地工作。

现在我有一个如下所示的测试。它们大约有40个,每个都需要在每个API请求中发送一个令牌。

代码语言:javascript
复制
// should is not used directly in the file but is added as a mocha requirement

import supertest from 'supertest';
import app from '../app';

const server = supertest.agent(app);
const BASE_URL = '/api/v1';

describe('/loans: Get all loans', () => {
    it('should return a list of all loans', done => {
        server
            .get(`${BASE_URL}/loans`)
            .expect(200)
            .end((err, res) => {
                res.status.should.equal(200);
                res.body.data.should.be.an.instanceOf(Array);
                for (const each of res.body.data) {
                    each.should.have.property('id');
                    each.should.have.property('userid');
                }
                done();
            });
    });
});

我研究过sinon,并尝试将verifyToken函数存根到mocha的before钩子中,如下所示

代码语言:javascript
复制
import sinon from 'sinon';
import AuthenticationMiddleware from '../middleware/authentication';

before(() => {
    const stub = sinon.stub(AuthenticationMiddleware, 'verifyToken');
    stub.returnsThis()
});

但我已经看到了一个问题。虽然可能已经创建了verifyToken存根,但在测试过程中不会使用它。在测试期间调用的verifyToken作为中间件从路由传递,如下所示

代码语言:javascript
复制
router.get('/loans', AuthenticationMiddleware.verifyToken, LoansController.get_all_loans);

我想要一种在测试期间存根verifyToken的方法,这样我就可以立即返回next()

我的问题是,有没有可能在测试期间通用地存根AuthenticationMiddleware.verifyToken ,以便所有对API端点的调用都调用存根版本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-30 10:20:33

根据Sinon stub being skipped as node express middlewareHow to mock middleware in Express to skip authentication for unit test?这两个帖子,我的存根不活动的原因是,甚至在存根创建之前,app就已经导入和缓存了,所以应用程序使用它缓存的存根。

因此,解决方案是在应用程序有机会缓存它之前更改所需的函数。我所做的(我是在反复试验中偶然发现的)是在我的测试文件夹中创建一个名为stubs.js的文件,内容如下。

代码语言:javascript
复制
import sinon from 'sinon';
import AuthenticationMiddleware from '../middleware/authentication';

sinon.stub(AuthenticationMiddleware, 'verifyToken').callsFake(
    (req, res, next) => next()
);

然后在我的package.json测试运行程序中需要这个文件,如下所示

代码语言:javascript
复制
    "scripts": {
        "test": "nyc --reporter=html --reporter=text --reporter=lcov mocha -r @babel/register -r should -r test/stubs.js"
    },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56369825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档