当前位置: 首页 > 知识库问答 >
问题:

为什么我的sinon存根表现得像在调用真实函数?

裘丰
2023-03-14

我试图遵循这个例子:https://www.alexjamesbrown.com/blog/development/stubbing-middleware-testing-express-supertest/ 但sinon存根似乎没有执行包装的代码。我已经看到了很多关于这个问题的堆栈溢出帖子,但没有一个答案可以帮助我弄清楚我做错了什么。每当我运行测试时,我都会收到以下错误:

1) should return a list of sites

0 次通过(42 毫秒)1 次失败

    < Li > GET/API/config/build pro/sites应返回站点列表:错误:预期200“正常”,测试时得到403“禁止”。测试时的_ assert status(node _ modules \ supertest \ lib \ Test . js:268:12)。_ assert function(node _ modules \ supertest \ lib \ test . js:283:11)at test . assert(node _ modules \ supertest \ lib \ test . js:173:18)at server . local assert(node _ modules \ supertest \ lib \ test . js:131:12)at emit closent(net . js:1655:8)at processTicksAndRejections(internal/process/task _ queues . js:83:21)

这让我相信它不是在调用存根代码,而是在执行实际的授权函数。这是我的代码:

const express = require('express');
const app = express();
const authorization = require('./security/authorization');

const configRoutes = require('./api/routes/config');

app.all('/api/*', authorization.authorize);
app.use('/api/config', configRoutes);

module.exports = app;
const aad = require('azure-ad-jwt');

module.exports.authorize = (req, res, next) => {
    if(!req.headers.authorization){
        res.status(403).json({
            message: "Auth failed"
        });
        return;
    }

    const jwtToken = req.headers.authorization.replace('Bearer ', '');

    aad.verify(jwtToken, null, function (err, result) {
        if (result) {
            next();
        } else {
            res.status(401).json({
                message: "Auth failed"
            });
        }
    });
};
const request = require('supertest');
const sinon = require('sinon');
const app = require('../app');
const authorization = require('../security/authorization');

var agent;

describe('GET /api/names', () => {
    before(() => {
        ensureAuthenticatedSpy = sinon.stub(authorization, 'authorize');

        ensureAuthenticatedSpy.callsArgWithAsync(2);

        agent = require('supertest')
            .agent(require('../app'));
    });

    it('should return a list of names', done => {
        agent
            .get('/api/config/buildPro/sites')
            .expect(200)
            .end((err, res) => {
                if (err) return done(err);
                done();
            });
    });
});

共有1个答案

扈阳辉
2023-03-14

而是执行实际的授权

这正是正在发生的事情。

在服务器中注意此代码:

app.all('/api/*', authorization.authorize);

这解决了授权函数在这个特定程序状态下的引用,并表示将使用这个特定函数(原始函数!)用于程序的其余部分。

这:

ensureAuthenticatedSpy = sinon.stub(authorization, 'authorize');

后来被调用,鉴于西农无权更改对先前捕获的原始授权的引用……不适用。

IOW,基本Javascript应用程序中的依赖注入并不像人们想要的那么简单。

要解决此问题,您可以在app.js中更改原始路由:

app.all('/api/*', (req, res, next) => authorization.authorize(req, res, next));

现在,您的闭包会在每次调用< code > authorization . authorize 时解析它,启用您感兴趣的模仿/监视功能。然而,这种解决方案并不完美。

 类似资料:
  • 我在我的单元测试中使用了sinon间谍。我正在测试的函数调用了一次间谍函数,但sinon坚持说它根本没有调用它。 正在测试的代码: 还有我的单元测试: 来自西农的消息: < li>draughts应检测显示方法:AssertError:预期displayBoard将被调用一次,但在object . assert .[as called once](node _ modules \ sinon \

  • 我有一个带有路由器的express应用程序,我想与Sinon一起测试。我无法成功模拟传递到请求处理程序的参数,希望能得到一些帮助。 这是我当前使用Mocha、Sinon、Chai的测试设置

  • 如果我已经通过< code > var a = sinon . createstuinstance(my contractor)创建了一个实例。 如何替换其中一个存根函数,如 。 我这样做的主要原因是想实现这个提到的多个回调解决方法

  • 问题内容: 我希望对我当前正在测试的文件中使用的函数存根。像这样的解构需要此函数: 测试时,永远不会调用存根,而是继续调用实函数。但是当我“正常”地要求它时(即:不破坏结构) 然后正确使用存根,一切正常 我感觉这是因为解构的工作原理以及直接对对象属性而不是对函数进行存根的事实。无论如何,如果您能为我提供一些见解,我将不胜感激! 问题答案: 使用从从属模块进行解构时,对模块的方法进行插桩的原因很简单

  • 我有一个Redux操作,它本身分派了另外两个操作。每个操作都是从导入的函数中检索的。一个来自本地模块,另一个来自外部库。 在我的测试中,我使用一个 沙箱来存根函数,但只有两个测试通过。我期待所有3个都通过。 最后一个预期失败,错误为: TypeError:[Function:functionB]不是间谍或对间谍的调用! 当我将功能输出到控制台时,我得到了这个,这似乎与Babel导入导出导出的方式有

  • 我在获取一个sinon存根以返回/解析另一个sinon存根时遇到问题。我正在使用西农、柴、柴和摩卡。 我正在按顺序执行许多异步任务,我想测试的代码看起来像这样: 我尝试为此创建存根的尝试如下所示: “saveit”方法在Terminal.prototype,这就是为什么我需要在那里存根它。当我尝试运行它时,我收到错误消息: 在线上: 但如果我在控制台中转储终端对象,它看起来很好,就像任何其他存根对