美文网首页前端人生程序员我爱编程
Node.js 使用强大的断言库 power-assert 进行

Node.js 使用强大的断言库 power-assert 进行

作者: 小菜荔枝 | 来源:发表于2016-12-12 15:28 被阅读1131次
power-assert
  之前开发Node.js的项目时,一直都是使用mocha测试框架结合断言库(如should.jschaiexpect.js等)进行BDD单体测试的。但是这些断言库都有很多自己的APIs方法,需要花大量的时间去学习,而且这些断言库没有详细的描述性信息,抛出的错误都是类似于这种信息:AssertionError true == false,除了这个我们不知道任何其他的信息,只能通过console.log()去查看,使用起来不是很方便。所以,今天给大家推荐一个强大的断言库power-assert,如何使用它呢?首先在您的项目工程目录下安装一些必要的包:
npm install --save-dev mocha power-assert intelli-espower-loader

安装后在你的工程目录下新建一个test文件夹并把你的测试代码放到该文件夹下(注意,如果没有指定测试路径,其默认名字必须叫test),下面是作者写的一些测试代码test/test.js,其用来验证power-assertshould.js的区别

const assert = require('power-assert');
const should = require('should');      // 别忘记 npm install should
const obj = {  
  arr: [1,2,3],  
  number: 10
};

describe('should.js和power-assert的区别', () => {  
  it('使用should.js的情况', () => {    
    should(obj.arr[0]).be.equal(obj.number);      // should api
  });  

  it('使用power-assert的情况', () => {    
    assert(obj.arr[0] === obj.number);      // 用assert就可以
  });
});

启动mocha进行测试:

node_modules/mocha/bin/mocha --require intelli-espower-loader test/test.js
运行结果

我们可以看到power-assert的强大之处,相比于should.js仅仅提供的判断性信息,power-assert则给开发者提供了尽可能多的描述性信息,而且还完全兼容Node.js内置模块Assert的全部APIs,不需要学习其他断言库的海量APIs如should.jschaiexcept.js等等,它的宗旨就是No API is the best API,坚持最简单的测试形式为原则,你甚至只需要使用assert(any_expression)这一个方法即可满足你全部的测试需求,相当于没有API的概念,而且还可以自定义我们自己的APIs(customization-api),是不是很强大呢!
最后,贴上一些测试代码供读者参考,体验power-assert的强大吧!

var assert = require('power-assert');

describe('Array', function () {
  beforeEach(function () {
    this.ary = [1, 2, 3];
  });
  describe('#indexOf()', function () {
    it('should return index when the value is present', function () {
      var zero = 0, two = 2;
      assert(this.ary.indexOf(zero) === two);
    });
    it('should return -1 when the value is not present', function () {
      var minusOne = -1, two = 2;
      assert.ok(this.ary.indexOf(two) === minusOne, 'THIS IS AN ASSERTION MESSAGE');
    });
  });
});

describe('various types', function () {
  function Person(name, age) {
    this.name = name;
    this.age = age;
  }

  beforeEach(function () {
    this.types = [
      'string', 98.6, true, false, null, undefined,
      ['nested', 'array'],
      {object: true},
      NaN, Infinity,
      /^not/,
      new Person('alice', 3)
    ];
  });
  it('demo', function () {
    var index = this.types.length - 1,
      bob = new Person('bob', 5);
    assert(this.types[index].name === bob.name);
  });
});

ps:这里科普一下,npm中的--save--save-dev参数的区别,--save一般规定把产品运行时(或生产环境)需要的npm包存入到package.jsondependencies中,而--save-dev则是将产品的开发环境需要的npm包存入到package.jsondevDependencies中,上面提到的mochapower-assert就属于开发环境需要的依赖(他们只负责单体测试,是独立于项目应用运行的),所以作者用了--save-dev的参数,当然这里没有硬性的规定,用哪个方案程序都可以正确运行,只是方便开发者管理而已。

power-assert 参考
Node.js Assert 参考

简书作者 小菜荔枝 转载请联系作者获得授权

相关文章

网友评论

    本文标题:Node.js 使用强大的断言库 power-assert 进行

    本文链接:https://www.haomeiwen.com/subject/jbsemttx.html