我正在使用浏览器运行器在Mocha中运行一些异步测试,我正在尝试使用Chai的期望样式断言:
window.expect = chai.expect;
describe('my test', function() {
it('should do something', function (done) {
setTimeout(function () {
expect(true).to.equal(false);
}, 100);
}
}
这不会给我正常的失败断言消息,而是我得到:
Error: the string "Uncaught AssertionError: expected true to equal false" was thrown, throw an Error :)
at Runner.fail (http://localhost:8000/tests/integration/mocha/vendor/mocha.js:3475:11)
at Runner.uncaught (http://localhost:8000/tests/integration/mocha/vendor/mocha.js:3748:8)
at uncaught (http://localhost:8000/tests/integration/mocha/vendor/mocha.js:3778:10)
所以它显然正在捕捉错误,它只是没有正确显示它 . 任何想法如何做到这一点?我想我可以用一个错误对象调用“完成”,但后来我失去了像柴这样的东西的所有优雅,它变得非常笨重......
13 回答
您的异步测试会在
it()
无法捕获的情况下生成异常,因为异常是在it()
范围之外抛出的 .您在节点下使用
process.on('uncaughtException')
或在浏览器中使用window.onerror()
捕获显示的捕获异常 .要解决此问题,您需要在
setTimeout()
调用的异步函数中捕获异常,以便将异常作为第一个参数调用done()
. 您还需要在没有参数的情况下调用done()
以指示成功,否则mocha将报告超时错误,因为您的测试函数永远不会发出信号表示已完成:在所有测试用例上这样做很烦人,而不是干,所以你可能想要为你提供一个功能 . 我们叫这个函数
check()
:使用
check()
,您现在可以按如下方式重写异步测试:以下是我对ES6 / ES2015承诺和ES7 / ES2016 async / await的通过测试 . 希望这为研究此主题的任何人提供了一个很好的更新答案:
如果您喜欢承诺,请尝试Chai as Promised Q,允许这样的内容:
我在Mocha邮件列表中问了同样的事情 . 他们基本上告诉我这个:用Mocha和Chai编写异步测试:
总是用
if (err) done(err);
开始测试始终以
done()
结束测试 .它解决了我的问题,并没有改变我的代码中间的一行(Chai期望的其他) .
setTimout
不是进行异步测试的方法 .这是link to the discussion in the mailing list .
我发布了一个解决这个问题的软件包 .
首先安装
check-chai
包:npm install --save check-chai
然后在测试中,使用
chai.use(checkChai);
,然后使用chai.check
帮助函数,如下所示:每Is there a way to get Chai working with asynchronous Mocha tests?我将其作为NPM包发布 .
有关更多信息,请参阅https://github.com/niftylettuce/check-chai .
尝试chaiAsPromised!除了出色地命名,你可以使用如下语句:
expect(asyncToResultingValue()).to.eventually.equal(true)
Can confirm,适用于摩卡柴 .
https://github.com/domenic/chai-as-promised
与Jean Vincent's answer非常相关并受其启发,我们使用类似于他的
check
函数的辅助函数,但我们将其称为eventually
(这有助于它与chai-as-promised的命名约定相匹配) . 它返回一个函数,该函数接受任意数量的参数并将它们传递给原始回调 . 这有助于消除测试中额外的嵌套功能块,并允许您处理任何类型的异步回调 . 这是在ES2015中写的:用法示例:
我知道有很多重复的答案和建议的软件包来解决这个问题,但是我没有看到上面的简单解决方案为这两个用例提供了简洁的模式 . 我发布这个作为其他希望复制意大利面的人的综合答案:
事件回调
节点样式回调
示例用法
根据@richardforrester http://staxmanade.com/2015/11/testing-asyncronous-code-with-mochajs-and-es7-async-await/提供的链接,如果省略done参数,describe可以使用返回的Promise .
唯一的缺点就是那里有一个Promise,而不是任何异步函数(你可以用Promise包装它,你) . 但在这种情况下,代码可以大大减少 .
它考虑了初始funcThatReturnsAPromise函数或期望中的失败:
我解决了它将
try/catch
解压缩到一个函数 .然后在
it()
我打电话:它也可以调试 .
测试期间的定时器和异步听起来非常粗糙 . 有一种方法可以通过基于承诺的方法来实现 .
此异步功能使用Web客户端(在本例中为Slacks SDK) . SDK负责API调用的异步性并返回有效负载 . 然后我们可以通过运行
expect
来测试chai中的有效负载异步promise中返回的对象 .什么对我来说非常好icm Mocha / Chai是来自Sinon图书馆的fakeTimer . 只需在必要时在测试中推进计时器 .
有更快的完成测试的额外好处 .
您还可以使用域模块 . 例如: