在前端自动化测试中,Chai 是一个非常常用的断言库。然而,在使用 Chai 进行 promise 断言时,有时会遇到断言不生效的情况,导致测试失败。本文将介绍这种情况的原因,并提供解决方案。
问题描述
假设我们有一个异步函数 fetchData()
,该函数返回一个 promise 对象,其中 resolve 的值是一个字符串 "Hello World"。我们使用 Chai 来进行断言,期望该 promise 对象 resolve 的值为 "Hello World"。
// javascriptcn.com 代码示例 function fetchData() { return new Promise(resolve => { setTimeout(() => { resolve("Hello World"); }, 1000); }); } describe("fetchData", () => { it("should return 'Hello World'", () => { return fetchData().then(data => { expect(data).to.equal("Hello World"); }); }); });
然而,运行测试时,我们发现测试失败了,报错信息为:
AssertionError: expected promise to equal 'Hello World'
问题原因
这种情况的原因是我们在测试中使用了 then
方法来对 promise 进行断言。then
方法返回的是一个新的 promise 对象,而不是原始的 promise 对象。因此,Chai 断言库无法对新的 promise 进行断言,导致测试失败。
解决方案
解决这个问题的方法很简单,我们只需要将 then
方法改成 eventually
方法即可。eventually
方法是 Chai 对 promise 断言的特殊方法,它会等待 promise resolve 后再进行断言。
describe("fetchData", () => { it("should return 'Hello World'", () => { return expect(fetchData()).to.eventually.equal("Hello World"); }); });
这样,我们就可以成功地对 promise 进行断言了。
总结
在使用 Chai 进行 promise 断言时,我们需要注意使用 eventually
方法而不是 then
方法。这样可以确保我们对正确的 promise 进行断言,避免测试失败的情况发生。
示例代码:https://codepen.io/yyu/pen/dyWjJQX
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/656763ddd2f5e1655d0392ca