【问题标题】:How to wait for controller function to finish using sinon.js and Express in Node.js如何等待控制器功能完成在 Node.js 中使用 sinon.js 和 Express
【发布时间】:2021-05-23 10:01:08
【问题描述】:

我正在尝试为我的 Express 控制器功能之一编写单元测试,但是 sinon 调用不会等待控制器功能完成。我是否需要将控制器函数编写为 async 以便在测试中等待?

it('should allow creating', function (done) {
      const req = {
        body: {
          name: 'something here',
          isPrivate: 'true',
        },
        flash: sinon.spy(),
        user: { _id: mongoose.Types.ObjectId() }
      };
      const res = {
        redirect: sinon.spy()
      }

      leagueController.create(req, res);        
      req.flash.calledWith('success', 'League created').should.be.true;
      res.redirect.calledWith('/leagues').should.be.true;
      League.findOne({ name: 'something here' }, (err, league) => {
        should.exist(league);
        done();
      });      
    });

这是一个简化的控制器功能:

function create(req, res) {
  const { name, isPrivate } = req.body;
  let newLeague = new League({
    name: name,
    isPrivate: isPrivate,
  });
  newLeague.save(function (err) {
    if (err) {
      req.flash('error', err.message || err);
      debug(err.message);
      return res.redirect('/leagues/new');
    }
    req.flash('success', 'League created');
    debug('league created');
    return res.redirect('/leagues');
  });
}

【问题讨论】:

  • 我需要把控制器函数写成异步的,这样我才能在测试中等待 - 是的
  • 您是否尝试过制作您通过测试async的功能?
  • 你需要显示控制器的代码。请创建一个最小的、可重现的示例

标签: node.js express mongoose sinon sinon-chai


【解决方案1】:

如果您的控制器实际上并未发送网络请求(我希望不在单元测试中),最简单的方法是使用fake-timers 并执行一个小的clock.tick(50)

如果它确实执行了异步操作,那么最好的方法是从 newLeague.save 返回一个承诺

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多