node.js的断言库?

时间:2013-01-12 15:02:01

标签: node.js unit-testing assert nodeunit chai

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

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

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

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

5 个答案:

答案 0 :(得分:9)

这也是一个偏好问题 - 您是否更喜欢使用assert语法或BDD样式的断言(smth.must.equal(...))进行测试。

对于断言样式,Chai's assert可能效果很好。它有更多的内置匹配器,Node自己的断言模块。

如果您发现BDD风格更具可读性和流畅性,那么三者都会这样做:

它们的主要区别在于各种匹配器的API的简单性或复杂性。但是,他们的基本平等断言是可互换的 - foo.must.equal(42)foo.should.equal(42)

在选择Chai.js和Should.js时,你需要注意一件事我认为是基本设计错误 - 他们在属性访问上断言的做法,而不是将匹配器称为一个功能。我写了critique of asserting on property access以及它如何在测试中引起误报。

答案 1 :(得分: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不是宣传自己项目的地方,但我认为在这种情况下,答案强迫我这样做,因为'你能推荐'的答案是'我自己的工具' '在这种情况下,对于 ME ,它是最合适的。因此,请不要将此帖子视为垃圾邮件。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可能对基于Hamjest的JavaScript匹配库Hamcrest感兴趣。

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

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

  1. 匹配器可以嵌套和组合以创建非常富有表现力的断言。
  2. 断言错误详细描述了不匹配的原因(例如,哪个属性不匹配,缺少哪个元素等),而不是仅仅重复断言。
  3. 免责声明:我是Hamjest的主要作者。

答案 4 :(得分:1)

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

var pi = Math.PI;
expect(pi)
  .toExist()
  .toBeLessThan(4)
  .toBeGreaterThan(3);