精华 可能是最好的 JS Assert 库 - 皇帝的新衣
发布于 9 年前 作者 atian25 10339 次浏览 来自 分享

如果你的 Node.js 应用没有写单元测试,那可以直接跳到尾部看最后一个链接。 转自 Egg.js 知乎专栏:https://zhuanlan.zhihu.com/p/25956323

1. 缘起

在我们日常的单元测试中,常用的断言库有:

user.should.have.property('name', 'tz');
user.enabled.should.ok;
expect(5).to.be.a('number');
expect(window).not.to.be.an(Image);

存在什么问题呢?

  • 复杂的 API,每次使用时,都需要去翻文档,用自然语言描述测试真的好么?
  • 经常怀疑人生,user.enabled.should.ok; 这句到底有没有执行? 还是只是取值?
  • 一脸懵逼,反馈信息不足,往往我们还需要加 log 再跑一次,如果在 ci 上看日志就懵逼了。
const should = require('should');
const expect = require('expect.js');
const assert = require('assert');
describe('test/showcase.test.js', () => {
 const arr = [ 1, 2, 3 ];
 it('should.js', () => {
 arr[1].should.eql(10);
 });
 it('expect.js', () => {
 expect(arr[1]).to.eql(10);
 });
 it('assert', () => {
 // 用原生的话, 得到的提示更是一脸懵逼
 assert(arr[1] === 10);
 });
});
// output:
1) test/showcase.test.js should.js:
 AssertionError: expected 2 to equal 10
 ...
2) test/showcase.test.js expect.js:
 Error: expected 2 to sort of equal 10
 ...
3) test/showcase.test.js assert:
 AssertionError: false == true
 ...

2. 曙光

Egg,js 的开发中, 我们发现了不一样的它:

Power Assert in JavaScript.

Provides descriptive assertion messages through standard assert interface.

No API is the best API.

https://github.com/power-assert-js/power-assert

简单的说,它的优点是:

  • 没有 API 就是最好的 API,不需要任何记忆,只需 assert 即可。
  • 强大的错误信息反馈
  • 强大的错误信息反馈
  • 强大的错误信息反馈
const assert = require('power-assert');
describe('test/showcase.test.js', () => {
 const arr = [ 1, 2, 3 ];
 it('power-assert', () => {
 assert(arr[1] === 10);
 });
});
// output:
4) test/showcase.test.js power-assert:
 AssertionError: # test/showcase.test.js:6
 assert(arr[1] === 10)
 | | |
 | 2 false
 [1,2,3]
 [number] 10
 => 10
 [number] arr[1]
 => 2

image

3. 使用

在线尝试:https://azu.github.io/power-assert-demo/

安装依赖:

$ npm i mocha power-assert intelli-espower-loader --save-dev

配置 npm scripts:

{
 "scripts": {
 "test": "mocha -r intelli-espower-loader test/**/*.test.js",
 },
 "devDependencies": {
 "power-assert": "^1.4.2",
 "intelli-espower-loader": "^1.0.1",
 }
}

编写测试:

// 简单的 require, 使用者无感知
// 下面的代码没写错, 无需 `require('power-assert')`, loader 会自动替换
const assert = require('assert');
describe('test/showcase.test.js', () => {
 const arr = [ 1, 2, 3 ];
 it('power-assert', () => {
 // 完全兼容 node 原生的 assert API, 直接自由使用
 assert(arr[1] === 10);
 });
});

执行测试:

$ npm test

4. 其他

5 回复

ava也是用的这个,感觉被那啥了

真的有人 练出来了没

不一样的吧,should.js等是为了BDD或TDD,通过代码明白是为了做什么,断言写出了像是一句话。user.enabled.should.ok 可以改为 user.enabled.should.be.ok

回到顶部

AltStyle によって変換されたページ (->オリジナル) /