当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?

Posted

技术标签:

【中文标题】当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?【英文标题】:How to make assertions inside a promise when any errors thrown don't bubble up? 【发布时间】:2014-08-24 19:21:21 【问题描述】:

使用 mocha 运行它会导致超时,而不是让 mocha 捕获错误,因此它可能会立即失败..

var when = require('when');
var should = require('should');

describe('', function() 
    it('', function(done) 
        var d = when.defer();
        d.resolve();
        d.promise.then(function() 
            true.should.be.false;
            false.should.be.true;
            throw new Error('Promise');
            done();
); ); );

http://runnable.com/me/U7VmuQurokZCvomD

是否有另一种方法可以在 Promise 中进行断言,这样当它们失败时,它们会被 mocha 捕获,导致它立即失败?


根据 chai 的建议,我研究了一下,似乎我必须直接访问 promise 对象,对吧?问题是我没有直接使用promise .. 如果我简化了我的错,但这将是一个更接近现实的例子

function core_library_function(callback)
    do_something_async(function which_returns_a(promise)
        promise.then(function()
            callback(thing);
); ); 

describe('', function() 
    it('', function(done) 
        core_library_function(function(thing)
            ...
            done();                         
); ); );

所以我真的无法直接控制 Promise,它被抽象得很远。

【问题讨论】:

按承诺考虑柴 【参考方案1】:

在 Mocha 中使用 Promise 时,您必须在测试中使用 return 的 Promise 并希望删除 done 参数,因为未使用回调。

it('', function() 
    var d = when.defer();
    d.resolve();
    return d.promise.then(function() 
        throw new Error('Promise');
    );
);

这在Working with Promises 下的文档中有所描述:

或者,您可以返回一个承诺,而不是使用done() 回调。

【讨论】:

我还发现最后调用的catch() 函数同样运行良好,在内部调用done() 并将错误传递给它:***.com/a/40563588/88111

以上是关于当抛出的任何错误都没有冒泡时,如何在 Promise 中进行断言?的主要内容,如果未能解决你的问题,请参考以下文章

如何找出PHP代码块可能抛出的所有错误?

测试在抛出的 func 上返回“表达式类型不明确,没有更多上下文”

如何让 Jest 静默测试抛出的错误

如何捕获 node_modules 中抛出的异常

如何解决在Angular 6中为业力测试抛出的[object ErrorEvent]

测试 Mocha 中抛出的错误 [重复]