问题标签 [chai]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1152 浏览

javascript - 等效于 rspec =~ 用于 Chai 中的数组

Chai,匹配器是否与 rspecs 等效=~(这意味着具有所有元素,但顺序无关紧要。

传递示例

失败

0 投票
3 回答
1316 浏览

mocha.js - Chai, Mocha:识别应该断言

我使用mochaandchai作为断言。

我的规范中有几个断言:

如果其中一个失败,mocha 会写“预期错误为真”。有没有办法识别它们?

expect可以做到:

这样的事情可能should吗?

0 投票
1 回答
1604 浏览

node.js - 使用 Mocha/Chai 测试 CoffeeScript 时出现奇怪的 fs.readFile 行为

请考虑我有以下 CoffeeScript 代码:

以下是 Mocha 的测试文件:

我运行测试:

对我来说奇怪的是控制台什么也没记录。当我将 Coffee 更改为此时(在末尾添加了两行):

我运行了测试,现在控制台记录fs.readFile callback fired了两次,正如预期的那样。

那么,为什么控制台在第一种情况下是空的?

0 投票
1 回答
367 浏览

node.js - 每次测试前都无法获得所需的文件

我尝试将 mocha 与 coffeescript 和 chai 结合使用。在每个包含测试的文件之前,我想包含以下文件:

测试/_helper.coffee

这样我就可以访问 AppDir 变量。这样当我需要一个文件时,我就不必指定应用程序目录的完整路径。

测试/应用程序/setup-test.coffee

我尝试了以下设置:

将 _hellper.coffee 添加到 mocha 命令行选项,如下所示:

所以:

我在 setup-test.coffee 中尝试了一个正常的要求:

无论我使用什么方法,如果我运行测试,我都会收到以下错误:

如果有人想知道我如何运行测试,这是我的 MAKE 文件:

生成文件

有人可以帮助我吗,谢谢。

0 投票
1 回答
2692 浏览

node.js - 在 Mocha 中测试异步抛出

如果连接中断,我有一段代码会尝试重新连接到 Redis。如果无法重新建立连接,则会引发错误。我正在尝试测试引发错误的代码块,但我无法使用 mocha 和 chai 编写成功的测试。

我的测试如下所示:

我试过使用 assert().throws 但在异步抛出发生之前失败了。出于同样的原因,try/catch 块也会失败。我的猜测是 mocha 捕获异常并重新抛出它,因为 uncaughtException 块确实得到了错误,但不是在 mocha 测试失败之前。有什么建议么?

编辑:

我曾尝试将调用包装在一个函数中:

我得到以下信息:

0 投票
2 回答
2236 浏览

node.js - 如何让 Chai.js 例外包含堆栈跟踪信息?

我在节点上使用 Chai.js。console.log(e)e 是 Chai.js 抛出的异常的行打印类似expected a to be within 0..3. 如何让 Chai.js 例外包含堆栈跟踪信息?

0 投票
1 回答
549 浏览

javascript - 在 sinon 中监视咖啡脚本构造函数

我正在尝试验证咖啡脚本构造函数是否引发异常(使用 sinon 和 sinon-chai)。

如何正确创建间谍来验证实例化 Dog 是否引发异常?

0 投票
3 回答
9370 浏览

node.js - 如何让“should.be.false”语法通过 jslint?

我正在为我的 NodeJS 代码编写 JS UT。我使用Chai作为断言库,我更喜欢should语法。我还使用jslint检查 JS 文件语法,甚至是 UT 的 JS 文件。

现在我遇到了jslintChai的问题。在Chai中,您可以使用:

但是jslint给了我:

我知道jslint有很多选项,但我就是找不到合适的选项来关闭此检查。

0 投票
2 回答
464 浏览

google-chrome - Chrome 和 Mocha 全球泄漏

我有以下非常简单的Mocha / Chai 测试:

这在 chrome 中失败,输出如下:

错误:检测到全局泄漏:css、cssFile、cssRule

在 Firefox 和 Safari 中,它都可以顺利通过。

Google 自己的Screen Capture扩展定义了另一个全局变量。禁用该扩展后,Mocha 仅抱怨css,cssFilecssRule是全局泄漏。

我检查了这些变量并没有在 Safari 或 Firefox 中定义,所以显然 Chrome 或我的一个 Chrome 扩展程序中的某些东西正在定义这三个变量。有没有办法找出哪个扩展定义了这些变量,而不是按顺序禁用和重新启用所有这些变量?

0 投票
2 回答
737 浏览

chai - 如何(以及是否)修改 Chai BDD 链中的对象

我将ChaiJS与我的Casper-Chai插件一起使用,但我不确定如何解决遇到的特定问题。

我希望能够编写测试,例如:

这非常简单,调用如下

*Method引用是对执行相应测试或可链接调用的函数的引用。

我的问题是让例如“选择器”修改链中的后代的最佳方式是什么。想到两个选择:

  1. 用于utils.flag(chai, 'object')将其更改为选择器;或者

  2. 用例如创建一个新标志utils.flag(chai, 'casper-selector')

当调用“可见”时,它可以读取相应的标志。修改“对象”似乎有用的地方是稍后调用例如“长度”时。但是,我有点担心更改“对象”的意外副作用。

我可能还想修改对象,用于“长度”测试,沿着链,例如:

感谢任何想法和输入。

----编辑----

好的,这就是让 Casper-Chai 扎根的概念挑战,这需要对 Casper 是什么以及为什么 Casper-Chai 应该是 Chai 插件而不仅仅是现有 Casper API 的替代品进行一些描述。Casper 是 PhantomJS 无头 Web 浏览器的包装器,因此 Casper 有效地运行两个不同的虚拟机:“控制器”和无头 Web 浏览器。

控制器中没有 DOM 或“文档”或“窗口”对象;Controller 在这方面很像 Node.js,尽管它使用 WebKit javascript 解析器。同时,PhantomJS 启动了一个无头 Web 浏览器。然后控制器可以通过 PhantomJS/Casper API 与无头浏览器进行通信。控制器可以告诉无头浏览器要加载哪些页面,运行什么 javascript(就像在控制台中输入 javascript),甚至可以模拟键盘输入和鼠标点击等事件。无头浏览器具有完整的 DOM 和 javascript 堆栈:它是在 WebKit 中加载的网页。您可以捕获WebKit 将呈现的屏幕截图。

Casper-Chai 在 Controller 中运行。在控制器中使用 Mocha + Chai 创建的测试旨在评估无头浏览器的状态。尽管我们可以将状态从浏览器复制到控制器并在复制的状态上运行测试,但我对该设计的有限实验揭示了设计固有的问题(即效率、竞争条件、性能和潜在的副作用)。问题是浏览器状态是动态的、复杂的并且可能很笨重。

所以以 John 的例子来说,expect(casper.find("#waldo")).to.be.visible是行不通的,因为没有 DOM,除非 Casper 返回的对象进行了某种惰性评估/调解。即使我们序列化并复制了 HTML 元素,Controller 中也没有 CSS。然后,即使有 CSS for #waldo,也无法像 Web 浏览器一样测试层次结构。我们将不得不复制大部分 DOM 和所有 CSS,然后复制一个 Web 浏览器来测试是否#waldo可见 - 对于每个单独的测试。Casper-Chai 旨在通过在浏览器中运行测试来避免这个问题。

只是为了一点额外的照明,一个简单的比较是获得匹配选择器的元素数量。可以写expect(casper.evaluate(function () {return __utils__.findAll('.my_class')}).to.have.length(4), wherecasper.evaluate在无头浏览器中运行给定的函数,并返回与选择器匹配的 DOM 元素列表作为字符串;您可以将其__utils__视为 Casper 的 jQuery 版本。或者,可以写expect(casper).selector('.my_class').to.have.length(4)whereselector成为“对象”,它有一个.length调用 'casper.evaluate(function () { return utils.findAll('.my_class').length`。仅返回整数长度。对于少量测试,要么工作正常,但对于大量测试,此性能特征变得有影响力(在这里,以这种简单的形式,并且在更复杂的情况下可能在更大程度上影响)。

当然可以写expect(casper.evaluate(function () { __utils__.findAll('.my_class').length }).equal(4),但如果要写这样的测试,为什么还要麻烦 BDD/Chai?它消除了 Chai 提供的可读性优势。

另外值得注意的是,Controller中可能有多个Casper实例,对应多个PhantomJS页面。把它们想象成诡异的标签。

因此,鉴于 Domenic 的回答是修改“对象”标志是解决问题的适当方法,这似乎是最实用的方法 - 根据上述描述进行任何思考。

我希望上面描述了为什么 Casper-Chai 应该是一个插件,而不仅仅是 Casper 的 API 扩展。我还将由 Casper 的作者运行它,看看他是否有任何意见。

这可能不是一段完美的关系,但我希望 Casper 和 Chai 可以轻松相处。:)