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

与兴农柴一起测试在具有多个回调的节点JS Express路由中调用了单个回调

应和悦
2023-03-14

我对Node和Sinon比较陌生。这个应用程序是用Express制作的,我使用的是摩卡、柴和Sinon。使用Sinon-cha,我在Express中测试带有多个回调的POST路由,不知道如何检查第二次和后续回调。

我index.js里面的路线是:

var controller = require('./example.controller');
var validator = require('./example.validator');
var router = express.Router();

router.post('/', validator.create, controller.create);

在我的validator.js中是validator.create,它检查提交的参数:

exports.create = function(req, res, next) {
  var valid = true;
  var errorMessages = [];

  if (req.body.name) {
    patt = /[^a-zA-Z0-9 !@#$%^&*()_+\-=\[\]{};':]/g;
    if (patt.test(req.body.name)) {
      valid = false;
      errorMessages.push("Parameter is not alphanumeric");
    }
  }

  if (valid == false) {
    return res.status(400).json(errorMessages);
  }

  next();
}

在我的控制器中。js是控制器。create,用于在数据库中创建条目:

exports.create = function(req, res) {
    return Example.create(req.body)
        .then(baseController.respondWithResult(res, 201))
        .catch(baseController.handleError(res));
}

Sinon Chai在我的index.spec.js中测试:

var proxyquire = require('proxyquire').noPreserveCache();   

var exampleCtrlStub = {
    create: 'exampleCtrl.create',
};

var exampleValidatorStub = {
    create: 'exampleValidator.create'
}

var routerStub = {
    get: sinon.spy(),
    put: sinon.spy(),
    patch: sinon.spy(),
    post: sinon.spy(),
    delete: sinon.spy()
};

var exampleIndex = proxyquire('./index.js', {
    express: {
        Router() {
            return routerStub;
        }
    },
    './example.controller': exampleCtrlStub,
    './example.validator': exampleValidatorStub
});

describe('POST /api/examples', function() {
    it('should route to example.validator.create', functhtml" target="_blank">ion() {
        routerStub.post
            .withArgs('/', 'exampleValidator.create')
            .should.have.been.calledOnce;
    });
});


describe('POST /api/examples', function() {
    it('should route to example.controller.create', function() {
        routerStub.post
            .withArgs('/', 'exampleCtrl.create')
            .should.have.been.called;
    });
});

虽然期望两个测试都通过,但第一个测试(验证器.create)通过,但第二个测试(控制器.create)失败。我无法找到一种方法来测试控制器.create是否被调用。

共有1个答案

江英华
2023-03-14

在第二个测试中,我们不能使用with Args跳过第一个验证器参数。测试失败,因为它正在寻找一个具有此签名的方法,该方法在源代码中不存在。

router.post('/', controller.create);

与Args总是从第一个参数开始,然后是第二个参数,依此类推。因此,解决方案是在测试中包含验证器

routerStub.post
  .withArgs('/', 'exampleValidator.create', 'exampleCtrl.create')
  .should.have.been.called;

参考文献:

    < Li > https://sino njs . org/releases/v 7 . 2 . 3/mocks/# expectationwithargsarg 1-arg 2-

希望它有所帮助

 类似资料:
  • 我有几个函数,我根据ajax调用中的列表填充下拉列表: 现在,在下拉列表被填充后,我想选择一个特定的项目,但要获得这个项目,我需要另一个ajax,如: 主要功能基本上是: 问题是,在< code>fillUpdateDropDown完成之前,已经到达了< code>getDefaultDetails的< code>success回调(dropdowns可能有很多项)。 我试图理解回调,但在我的情况

  • null 或使用数组 然而,在我们的应用程序中,我看到开发人员使用的语法是 请注意,没有array[],但是两个回调函数以逗号分隔的形式传递。这起作用了。只是好奇怎么会?

  • 问题内容: 我想在click事件中进行三个Ajax调用。每个ajax调用都会执行不同的操作,并返回最终回调所需的数据。调用本身并不相互依赖,它们可以同时进行,但是当三个都完成时,我希望有一个最终的回调。 问题答案: 这是我写的一个回调对象,您可以设置单个回调以在全部完成后触发,也可以让每个回调都有自己的回调并在全部完成后触发它们: 注意 从jQuery 1.5+开始,您可以按照另一个答案中所述使用

  • 我用的是parse.com。每个包里面都有很多钻子,每个品类里面都有很多包。 我卡住了。然后(函数(result,result2,result3)在最后一行。promise可以有多个promise,它是可变的。有没有一种方法可以写出如下内容: 谢谢!

  • 我是React新手,我正试图通过React路由器的道具,通过应用程序(父)将数据从子组件传递到子组件。据我所知,你必须将道具从一个孩子回调到另一个应用,然后再回调到孩子。 主要的问题是如何从孩子那里得到道具。js到应用程序。js与回调和反应路由器。 应用程序。js 小孩js

  • 你好,我是拉威尔的新手,也许这对你们来说太傻了。在laravel 8中,路由web。php我创建了一条如下的路线: 我想问的是,我们也可以从回调视图返回控制器吗?所以在路由 /editprofile中,第二个参数不是'App\Http\Controller\SiteController@edit_profile',而是一个回调函数,如路由'/home'。 但是它返回错误哈哈。假设我不想用__con