6

node.js assert 为单元测试提供的断言非常有限。甚至在我编写第一个测试之前,我就已经创建了一些断言,因为很明显我将继续重复使用它们。

你能推荐一些好的断言库来测试常见的 javascript 情况(对象结构、对象类等)吗?

理想情况下,它应该与 nodeunit 很好地集成(或者更好地扩展它的断言)——我的断言没有,我必须将它们test作为额外的变量传递......

我见过的唯一一个是。你能说什么呢?

4

5 回答 5

10

这在某种程度上也是一个偏好问题——您更喜欢使用assert语法还是 BDD 风格的断言 ( smth.must.equal(...)) 进行测试。

对于断言风格,Chai 的断言可能会很好用。它具有比 Node 自己的断言模块更多的内置匹配器。

如果您发现 BDD 风格更具可读性和流畅性,那么这三个都可以:

当涉及到各种匹配器时,它们的主要区别在于其 API 的简单性或复杂性。但是,它们的基本平等断言是可以互换的——foo.must.equal(42)或者foo.should.equal(42)

在选择 Chai.js 和 Should.js 时,你需要注意一件事,我认为这是一个基本的设计错误——他们断言属性访问的做法,而不是将匹配器作为函数调用。我写了一篇关于断言属性访问以及它如何在测试中导致误报的评论。

于 2013-10-04T00:56:58.477 回答
2

柴太棒了 我已经为 Node 和浏览器测试尝试了很多不同的设置,但唯一让我满意的是Mocha + Chai + Sinon。但是选择一个断言库也是一个风格问题,我个人喜欢chai.expect它的链式 API,它拥有你需要的所有方法:类型验证、对象属性检查、异常……我也发现它非常灵活。

于 2013-01-12T15:35:45.700 回答
2

我使用自己的断言库node-assertthat。它的特点是它的语法看起来非常流畅并且(恕我直言)非常易读(受 NUnit for .NET 的启发),例如:

var actual = [...],
    expected = [...];

assert.that(actual, is.equalTo(expected));

基本上它工作得很好,但是还没有实现太多的断言。所以它是否“好”我不会决定——这取决于你。

它使用了一个比较库,它提供了诸如按结构比较对象和其他一些不错的东西:compare.js

例如,如果你需要对象并且你想知道它们是否相等(通过它们的值),你可以这样做

cmp.equal(foo, bar)

或简称:

cmp.eq(foo, bar)

您还可以按结构比较对象,例如检查两个对象是否实现相同的接口。你可以这样做

cmp.equalByStructure(foo, bar)

或简称:

cmp.eqs(foo, bar);

再一次,我会让你决定它是否“好”,但至少我对两者都非常满意。

PS:我知道 StackOverflow 不是宣传你自己的项目的地方,但我认为在这种情况下,答案迫使我这样做,因为在这种情况下,“你能推荐”的答案是“我自己的工具”是最合适的。因此,请不要将此帖子视为垃圾邮件。

于 2013-01-12T15:10:43.197 回答
1

您可能对Hamjest感兴趣,这是一个基于Hamcrest的 JavaScript 匹配器库。

我提供了一个与框架无关的断言和匹配器库,可以与 nodeunit、mocha、jasmin 等一起使用。

与 Chai、Jasmin 和类似框架相比,它有两个主要优势:

  1. 匹配器可以嵌套和组合以创建非常有表现力的断言。
  2. 断言错误非常详细地描述了不匹配的原因(例如,哪个属性不匹配,缺少哪个元素等),而不是仅仅重复断言。

免责声明:我是 Hamjest 的主要作者。

于 2015-09-29T13:25:18.550 回答
1

Expect是一个用于 NodeJS 和浏览器的易于使用的可扩展断言库。我已经在Mocha中使用过它几次,我可以说它有你需要的任何断言。您可以在此处了解如何使用它。例子:

var pi = Math.PI;
expect(pi)
  .toExist()
  .toBeLessThan(4)
  .toBeGreaterThan(3);
于 2016-02-23T20:20:08.850 回答