esp*_*esp 6 unit-testing assert node.js nodeunit chai
node.js断言为单元测试提供的断言非常有限.甚至在我编写第一个测试之前,我已经创建了一些断言,因为很明显我会继续重复使用它们.
你能推荐一些好的断言库来测试常见的javascript情况(对象结构,对象类等等)吗?
理想情况下,它应该与nodeunit很好地集成(或者,更好地,扩展它的断言) - 我的断言没有,我必须将它们test作为额外的变量传递...
我见过的唯一一个是柴.你能说些什么呢?
And*_*öll 10
这也是一个偏好问题 - 您是否更喜欢使用assert语法或BDD样式的断言(smth.must.equal(...))进行测试.
对于断言风格,Chai的断言可能运作良好.它有更多的内置匹配器,这是Node自己的断言模块.
如果您发现BDD风格更具可读性和流畅性,那么三者都会这样做:
它们的主要区别在于各种匹配器的API的简单性或复杂性.然而,他们的基本平等断言是可互换的 - foo.must.equal(42)或者foo.should.equal(42).
在挑选Chai.js和Should.js时,你需要注意一件事,我认为这是一个基本的设计错误 - 他们在属性访问上断言而不是将匹配器称为函数.我写了一篇关于对财产访问断言以及它如何在测试中引起误报的批评.
我使用我自己的断言库,node-assertthat。它的特点是它的语法看起来非常流畅并且(恕我直言)非常可读(受到 NUnit for .NET 的启发),例如:
var actual = [...],
expected = [...];
assert.that(actual, is.equalTo(expected));
Run Code Online (Sandbox Code Playgroud)
基本上它工作得很好,但是还没有实现太多断言。所以它是否“好”我不会决定——这取决于你。
它利用一个比较库,它提供了诸如按结构比较对象和其他一些好东西的功能:compare.js。
例如,如果您必须对象并且想知道它们是否相等(通过它们的值),您可以这样做
cmp.equal(foo, bar)
Run Code Online (Sandbox Code Playgroud)
或简称为:
cmp.eq(foo, bar)
Run Code Online (Sandbox Code Playgroud)
您还可以按结构比较对象,例如检查两个对象是否实现相同的接口。你可以这样做
cmp.equalByStructure(foo, bar)
Run Code Online (Sandbox Code Playgroud)
或简称为:
cmp.eqs(foo, bar);
Run Code Online (Sandbox Code Playgroud)
再说一次,我会让你决定它是否“好”,但至少我对使用两者都很满意。
PS:我知道 StackOverflow 不是宣传你自己的项目的地方,但我认为在这种情况下,答案迫使我这样做,因为在这种情况下,“你能推荐吗”的答案是“我自己的工具”我是最合适的。因此,请不要将此帖子视为垃圾邮件。