Chai 的 expect 和 should 不能同时使用的解决方法
在前端开发中,我们经常使用 Chai 这个测试库来进行单元测试。Chai 提供了两种不同的测试方式:expect 和 should。但是,有时候我们会遇到一个问题,就是无法同时使用 expect 和 should。这篇文章将会介绍这个问题的原因,并提供解决方法。
问题的原因
Chai 的 expect 和 should 都是 Chai 中的断言库,它们的作用都是用来断言某个值是否符合预期。但是,它们的实现方式是不同的。
expect 的实现方式是通过 Object.defineProperty 来定义一个 getter,当你去访问这个 getter 的时候,它会返回一个 Assertion 对象,然后你可以在这个 Assertion 对象上调用一些方法来进行断言。这种实现方式是非常灵活的,因为你可以在任何时候调用 expect 函数,而且它会返回一个新的 Assertion 对象,这个对象是独立的,不会受到其他对象的影响。
should 的实现方式是通过 Object.prototype 来扩展一个 should 属性,当你访问这个属性的时候,它会返回一个 Assertion 对象。这种实现方式的好处是可以直接在任何对象上使用 should 属性,而不需要显式地调用一个函数。但是,这种实现方式也有一个缺点,就是会污染全局的 Object.prototype,可能会导致一些意外的问题。
由于这两种实现方式的不同,导致了它们之间存在一些冲突,不能同时使用。
解决方法
为了解决这个问题,我们可以使用 Chai 提供的一个插件:chai-as-promised。这个插件提供了一个新的接口:expect(...).to.eventually,可以用来测试异步代码的返回值。这个接口使用的是 expect 的实现方式,不会受到 should 的影响,因此我们可以使用它来解决这个问题。
下面是一个示例代码:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- -------------- - ---------------------------- ------------------------- ----- ------ - ------------ ----- ------ - -------------- ---------------- -- -- - ---------- ------ -- -- - ----- ------- - ------------------------- --------------------------------------------- ----------------------------------------- --- ---
在这个示例代码中,我们先使用 chai.use(chaiAsPromised) 来启用 chai-as-promised 插件。然后,我们分别定义了 expect 和 should,然后在测试用例中使用了它们。由于我们使用了 chai-as-promised 插件提供的 expect(...).to.eventually 接口,因此我们可以同时使用 expect 和 should,而不会出现冲突。
结论
Chai 是一个非常好用的测试库,它提供了丰富的断言方式,可以帮助我们轻松地编写单元测试。但是,在使用 Chai 的时候,我们需要注意 expect 和 should 的实现方式的不同,避免它们之间的冲突。如果我们需要同时使用 expect 和 should,可以使用 chai-as-promised 插件提供的 expect(...).to.eventually 接口来解决这个问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675e4d7de1dcc5c0fa45ae97