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

使用Sinon Chai时,失败测试显示“错误:超时超过2000ms”

滕令雪
2023-03-14

我有以下路线(快速),我正在为此编写集成测试。

代码如下:

var q = require("q"),
    request = require("request");

/*
    Example of service wrapper that makes HTTP request.
*/
function getProducts() {

    var deferred = q.defer();

    request.get({uri : "http://localhost/some-service" }, function (e, r, body) {
        deferred.resolve(JSON.parse(body));
    });

    return deferred.promise;
}

/*
    The route
*/
exports.getProducts = function (request, response) {
    getProducts()
        .then(function (data) {
            response.write(JSON.stringify(data));
            response.end();
        });
};

我想测试所有组件是否协同工作,但使用虚假的HTTP响应,因此我正在为请求/ http交互创建一个存根。

我使用Chai、Sinon、Sinon Chai和Mocha作为测试跑步者。

以下是测试代码:

var chai = require("chai"),
    should = chai.should(),
    sinon = require("sinon"),
    sinonChai = require("sinon-chai"),
    route = require("../routes"),
    request = require("request");

chai.use(sinonChai);

describe("product service", function () {
    before(function(done){
        sinon
        .stub(request, "get")
        // change the text of product name to cause test failure.
        .yields(null, null, JSON.stringify({ products: [{ name : "product name" }] }));
        done();
    });

    after(function(done){
        request.get.restore();
        done();
    });

    it("should call product route and return expected resonse", function (done) {

        var writeSpy = {},
            response = {
            write : function () { 
                writeSpy.should.have.been.calledWith("{\"products\":[{\"name\":\"product name\"}]}");
                done();
            }
        };

        writeSpy = sinon.spy(response, "write");

        route.getProducts(null, response);
    });
}); 

如果写入响应(response.write)的参数匹配,则测试通过。问题是当测试失败时,失败消息是:

“错误:超时超过 2000 毫秒”

我已经引用了这个答案,但它并不能解决问题。

如何让这段代码显示正确的测试名称和失败的原因?

注:第二个问题可能是,是否可以改进响应对象的断言方式?

共有1个答案

范凡
2023-03-14

这个问题似乎有一个例外正在被吞噬。我想到的第一件事是在你的promise链末尾添加done

exports.getProducts = function (request, response) {
    getProducts()
        .then(function (data) {
            response.write(JSON.stringify(data));
            response.end();
        })
        .done(); /// <<< Add this!
};

通常情况下,在使用promise时,您希望通过调用这样的方法来结束链。有些实现称它已完成,有些则称为结束

如何让这段代码显示正确的测试名称和失败的原因?

如果Mocha从未看到异常,它就无法为您提供一条漂亮的错误消息。诊断可能吞咽异常的一种方法是在违规代码周围添加一个try… catch块并将某些内容转储到控制台。

 类似资料:
  • 问题内容: 在我的节点应用程序中,我正在使用mocha测试我的代码。使用mocha调用许多异步函数时,出现超时错误()。我该如何解决? 问题答案: 您可以在运行测试时设置超时: 或者,您可以通过编程为每个套件或每个测试设置超时: 有关更多信息,请参阅文档。

  • jasmine:在jasmine指定的超时内没有调用异步回调。DEFAULT_TIMEOUT_INTERVAL 测试window.post消息指令 用Jasmine async测试postMessage不起作用 我有下面的代码,我正在接收下面的输出。 在jasmine.DEFAULT\u timeout\u INTERVAL指定的超时内未调用异步回调 myService在父描述函数中定义。正如我所

  • 我从JUnit测试开始。 我正试图写一个简单的测试,却发现了这个问题。 当测试正常时,它显示在结果中:测试运行: 1,失败: 0,错误: 0,跳过: 0,时间流逝: 0.008秒 当我将一个1更改为0时,它应该失败:测试运行:0,失败:0,错误:0,跳过:0,经过的时间:0.008秒,它也不会抛出应该抛出的错误消息。 我是做错了什么,还是不应该这样?试图通过谷歌搜索,但找不到类似的问题。 我正在使

  • 我正在开发一个Spring boot应用程序,当响应时间超过30秒时,我必须抛出一个错误。 因为我正在使用应用程序。yml,我试过了 因为它不工作,尝试使用application.properties-. it不工作。 试图找出如何在这两种情况下抛出系统错误。即当系统空闲后发生超时且响应时间超过30秒时

  • 我正在尝试部署一个简单的应用程序,没什么大不了的,但我总是收到这个错误。 错误R10(启动超时)- 即使Heroku在60秒前就完成了部署。我也在服务器上设置了process.env.PORT。我在Heroku上有几个应用程序,所以我很熟悉部署。 我事先制作了服务器捆绑文件(src/build/bundle.js)和客户端捆绑文件(src/dist/bundle.js),并将所有内容推送到Hero

  • 在本教程中,我们将演示如何在TestNG中执行超时测试。 “超时”表示如果单元测试花费的时间超过指定的毫秒数,那么TestNG将会中止它并将其标记为失败。 “超时”也可用于性能测试,以确保方法在合理的时间内返回。 创建一个名称为:TimeoutTest 的 Maven 项目,其结构如下所示 - 创建一个测试类:TestTimeout.java,其代码如下 - 执行上面代码,得到以下结果 -