Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

7. mocha的单元测试 #11

Open
brandonxiang opened this issue Oct 6, 2017 · 0 comments
Open

7. mocha的单元测试 #11

brandonxiang opened this issue Oct 6, 2017 · 0 comments

Comments

@brandonxiang
Copy link
Member

源码github地址在此,记得点星:
https://github.com/brandonxiang/example-mocha

单元测试是好代码必经的一步。在python中我使用过内置库unittest,相对来说,比较简单。如果你在知乎上了解到thoughtwork这公司,你会清楚地认识到测试的重要性,thoughtworks非常推崇TDD,也就是先写测试再开始编码,这样看似效率较低,但是却有效提高了代码质量,也很好满足你对需求的测试。单元测试会涉及到两个概念,BDD和TDD。

  • BDD **行为驱动开发(Behavior Driven Development)**根据用户的行为需求去指导开发流程
  • TDD **测试驱动开发(Test-Driven Development)**先编写单元测试用例代码,测试代码确定需要编写什么产品代码

Javascript的测试框架非常多,参考在Node.js上用什么测试框架好,在Node.js中,mocha应该是测试框架中的首选。在这里,主要介绍mocha,should.js和chai.js。

mocha

mocha本身只是一个单元测试框架,可以兼容第三方断言库。

使用

参考brandonxiang/interpolator中的测试用例。

describe用于描述你需要单元测试的对象,内嵌几层,把整个过程详细描述。

it用于描述你需要单元测试的行为,闭包的函数是测试的内容,测试内容依靠断言库。

should.js

这是一个非常像自然语言语句的断言库。

如果你遇到的测试情况是数字5应该是准确的5,且是一个数字。

(5).should.be.exactly(5).and.be.a.Number();

同时,你想要检验它的内部属性。

var user = {
    name: 'tj'
  , pets: ['tobi', 'loki', 'jane', 'bandit']
};

user.should.have.property('name', 'tj');
user.should.have.property('pets').with.lengthOf(4);

chai.js

这是一个非常常用的断言库。

var chai = require('chai');  
var assert = chai.assert;    // 用 Assert style
var expect = chai.expect;    // 用 Expect style
var should = chai.should();  // 用 Should style

判断它等于某个值

expect(foo).to.equal('bar');

判断它是否为true

expect(foo).to.be.true;

判断它属性某个类型

expect(foo).to.be.a('string');

判断它的长度

expect(foo).to.have.lengthOf(3);  

判断它属性的长度

expect(beverages).to.have.property('tea').with.lengthOf(3);

should和expect

shouldexpect之间的区别在于,它考虑到ie的错误点,保证浏览器的兼容性。

还有非常多的相关项目,它们可以辅助你完成断言测试。

用例

用例1 如何在es6中使用mocha

Node.js笔记七:es6中,我提到了es6的一些优势。es6已经很流行,如何在mocha与es6配合就像是一个必修课。参考Testing in ES6 with Mocha and Babel 6,需要的步骤不多。主要还是在于你对babel的了解。babel-core更像一个引用钩子,而babel-preset-es2015则是es2015/es6的语法转换标准。

npm i babel-core -D
npm i babel-preset-es2015 -D

由于mocha并不会自动帮你写配置文件,所以你需要自己手动在项目的根目录底下编写.babelrc。这里只展示最基础的es2015,至于react和stage-0等,可以根据个人项目的需要自行添加,请自行研究。

{
  "presets": ["es2015"]
}

配置完成后,只需运行以下代码,即可用es6写mocha的测试用例。具体写法可以参考brandonxiang/weapp-i18n这个开源项目。

mocha --compilers js:babel-core/register

用例2 vue-cli项目中的单元测试

如今vue-cli构建项目可以直接送你“一整套”单元测试和覆盖率的工具(使用的是karmamochachai)。

坑:错误vuex requires a Promise polyfill in this browser

使用vuex的项目在测试时会出现一个问题,参考Vue unit test error: vuex requires a Promise polyfill in this browser,需要安装babel-polyfillbabel-polyfill是用于模拟es2015更多是在应用的情况下,非第三方库的情况下。

这意味着你能用一些内置方法像Promise或者WeakMap,静态方法像Array.from或者Object.assign,实例方法像 Array.prototype.includes,和生成器。polyfill帮你加进去全局变量像原始数据类型String一样。

npm install --save-dev babel-polyfill

在karma的配置文件karma.conf.js中添加:

files: [
  '../node_modules/babel-polyfill/dist/polyfill.js',
  'index.js'
],
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant