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

无法在mocha测试的上下文中调用sinon spy,该测试的方法调用带有promise的方法

华修永
2023-03-14

我有一个模块,它调用一个使用bluebirdpromise的方法。这是简化的模块。Cassandra只是一些db调用的包装器,它保证了它们:

var Cassandra = require('../lib/cassandraObject');
var cassandra = new Cassandra();
exports.doIt = function _doIt(req, res) {
    cassandra.queryPromise("query", [1, 2, 3])
    .then(function (results) {
        res.sendStatus(200);
     })
    .catch(function(er) {
        res.sendStatus(500);
    })
}

我正试图用西农和西农蓝鸟来测试这一点。我取消了Cassandra的查询promise,并让res.sendStatus成为间谍:

   it("makes a call to doIt", function () {
        var qpMock = sinon.stub(Cassandra.prototype, "queryPromise").resolves(['yay!']);
        var req = {};
        var res = {
            sendStatus: sinon.spy(),
        };
        myModule.doIt(req, res);
        expect(qpMock.args[0][1][0]).to.equal(1);   //ok
        expect(res.sendStatus).to.have.been.calledWith(200);  //error ! not called yet!
    }

我认为使用这些库,存根的then()将被立即调用,而不是异步调用,但情况似乎并非如此。确实调用了res.sendStatus()调用,但在测试超出范围之后。

有没有办法知道何时调用res.sendStatus()并将其保留在测试范围内,以便我可以断言传递给它的值?

共有1个答案

田冥夜
2023-03-14

我建议让doIt()链接,让它返回promise:

exports.doIt = function _doIt(req, res) {
    return cassandra.queryPromise("query", [1, 2, 3])
                    .then(function (results) {
                      res.sendStatus(200);
                    })
                    .catch(function(er) {
                      res.sendStatus(500);
                    })
}

这样,您可以在测试用例中等待完成,以便在确定它已被调用时检查res.sendstatus()

此外,由于Mocha支持开箱即用的promise,您可以从doIt()返回promise,以确保Mocha在继续之前等待您的测试完全完成:

it("makes a call to doIt", function () {
  var qpMock = sinon.stub(Cassandra.prototype, "queryPromise").resolves(['yay!']);
  var req = {};
  var res = { sendStatus: sinon.spy() };
  return myModule.doIt(req, res).then(() => {
    expect(qpMock.args[0][1][0]).to.equal(1); 
    expect(res.sendStatus).to.have.been.calledWith(200);
  });
})
 类似资料:
  • 您好,我有一个将人员添加到团队的方法。我想为此方法编写一个测试,但我是junit/mockito测试的新手,所以我有很多问题:这是我的添加方法: 这两个实体(人员/团队)之间存在关系,这是我的测试代码,但它不起作用: 模拟组合:

  • 我在我的服务层有一个方法: [1]这一行获取条形码,比如然后调用另一个类中的一个方法,该方法从数据库中检索有关该项目的信息,执行计算并返回价格。可能的值可以类似于。 [2]按价格对所有值进行升序排序。因此,如果列表包含和和,则将其排序为和。 当我尝试测试此方法时,当调用时,我得到空指针异常。我如何测试这个方法?我试着搜索并找到了一些关于使用mockito的问题和答案,但我不知道如何实现它。 我目前

  • 我正在用Mockito为一个项目设置jUnit测试。在被测系统(DrawingService)中调用方法时遇到问题。模拟包括图形和IDrawingRepository。 我不熟悉TDD、单元测试和一般的模拟,所以我可能犯了一些noob错误?任何帮助都将不胜感激。 以下是测试课程: 以下是正在测试的系统:

  • 我最近开始编写单元测试,并开始转向集成测试。我有这个相当简单的方法,但我有点迷失在如何接近,甚至如何准确地测试它。 通过阅读各种文章和Sinon文档,听起来我可能需要为?即使我用一个好的响应伪造了外部API调用,但如果它总是返回一个好的响应,那又有什么好处呢?因为这个方法所做的一切都是将放在一起,并返回外部调用的响应。我对术语“stub”、“spy”和“mock”以及我需要为这个包装器方法做什么感

  • 问题内容: 这可能吗?我尝试过,但EasyMock抱怨时间必须> = 1 问题答案: 我设法提出了一个解决方案:

  • 问题内容: 我有一些应调用某些输入的方法。不幸的是,测试这些情况会导致JUnit终止!将方法调用放在新的Thread中似乎无济于事,因为终止JVM不仅终止当前线程。有什么通用的模式可以处理吗?例如,我可以用存根替换吗? [编辑]有问题的类实际上是我要在JUnit中测试的命令行工具。也许JUnit根本不是适合该工作的工具?欢迎提出补充回归测试工具的建议(最好是与JUnit和EclEmma很好地集成在