首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >should.js不会导致mocha测试失败

should.js不会导致mocha测试失败
EN

Stack Overflow用户
提问于 2014-06-05 22:51:51
回答 1查看 2.3K关注 0票数 5

我对单元测试、mocha和should.js非常陌生,我正在尝试为一个返回承诺的异步方法编写一个测试。这是我的测试代码:

代码语言:javascript
复制
var should = require("should"),
    tideRetriever = require("../tide-retriever"),
    moment = require("moment"),
    timeFormat = "YYYY-MM-DD-HH:mm:ss",
    from = moment("2013-03-06T00:00:00", timeFormat),
    to = moment("2013-03-12T23:59:00", timeFormat),
    expectedCount = 300;

describe("tide retriever", function() {
    it("should retrieve and parse tide CSV data", function() {
        tideRetriever.get(from, to).then(
            function(entries) { // resolve
                entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
            },
            function(err) { // reject
                should.fail("Promise rejected", err);
            }
        );
    });
});

当我手动测试tideRetriever.get方法时,它一致地解析了一个由27个元素组成的数组(如预期的那样),但是无论expectedCount的值如何,测试都不会失败。下面是我的简单手动测试:

代码语言:javascript
复制
tideRetriever.get(from, to).then(
    function(entries) {
        console.log(entries, entries.length);
    },
    function(err) {
        console.log("Promise rejected", err);
    }
);

如果需要的话,我也可以发布测试模块的源代码。

我是不是误解了摩卡或should.js?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 12:12:13

更新

在某个时候,Mocha开始支持从测试中返回Promise,而不是添加done()回调。最初的答案仍然有效,但是使用这种方法测试看起来要干净得多:

代码语言:javascript
复制
it("should retrieve and parse tide CSV data", function() {
    return tideRetriever.get(from, to).then(
        function(entries) {
            entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
        }
    );
});

查看这个要旨以获得完整的示例。

原始

警告。接受的答案只适用于正常的异步代码,而不是承诺(作者使用的)。

不同之处在于,应用程序(在我们的例子中是Mocha)不能捕获来自允诺回调的异常,因此测试将通过超时而不是实际的断言失败。断言可以记录,也可以不记录,这取决于允诺实现。请在当文件上查看有关此问题的更多信息。

要正确地处理这个问题,您应该将err对象传递给done()回调,而不是抛出它。您可以使用Promise.catch()方法(在Promise.then()onRejection()回调中不使用,因为它不会捕获来自同一方法的onFulfilment()回调的异常)。见下面的例子:

代码语言:javascript
复制
describe("tide retriever", function() {
    it("should retrieve and parse tide CSV data", function(done) {
        tideRetriever.get(from, to).then(
            function(entries) { // resolve
                entries.should.be.instanceof(Array).and.have.lengthOf(expectedCount);
                done(); // test passes
            },
            function(err) { // reject
                done(err); // Promise rejected
            }
        ).catch(function (err) {
            done(err); // should throwed assertion
        });
    });
});

PS done()回调在三个地方使用,以涵盖所有可能的情况。但是,如果不需要任何特殊的逻辑,则可以完全删除onRejection()回调。在这种情况下,Promise.catch()也将处理拒绝。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24071493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档