未命名
mocha测试JavaScript代码教程
Mocha诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏览器和Node环境都可以使用。它是一个富特征的JavaScript测试框架。基于node.js和浏览器内置对象。
本文全面介绍如何使用Mocha,让你轻松上手。如果你以前对测试一无所知,本文也可以当作JavaScript单元测试入门。值得说明的是,除了Mocha以外,类似的测试框架还有Jasmine、Karma、Tape等,也很值得学习。
###1 首先,我们先来快速体验一下最简单的JavaScript单元测试使用。
1 你的电脑请先安装好node.js。
2 打开cmd终端。进入node.js的根目录下,执行以下代码
首先我们要全局安装Mocha:
1 | npm install -g mocha |
npm install chai1
2
3
4
5
4上面的代码将会在我们的项目中安装一个Chai的本地副本。接着,我们需要在项目目录下创建一个叫做test的文件夹,它用作Mocha默认的测试路径。所有的测试代码请放在这个test下面。
在同样新建一个lib文件夹,所有的被测代码都放在这个lib下。然后,我们需要明白一个概念就是TDD,简介在[这里](https://baike.baidu.com/item/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/3328831?fr=aladdin) ,利用TDD测试,我们必须要明白TDD的是我们只编写测试通过的功能代码,这样减少编码量。
接下来,我们按照TDD规则,先编写测试代码。当然,我们模拟的都是及其简单的方法。这里是测试lib文件下的tags.js文件(读者请自已建造)中暴露的parse方法。
var expect =require(‘chai’).expect; //引入我们需要chai断言库
var tags=require(“../lib/tags”);//这是引入的被测代码,在后面会给出
describe(‘Tags’, function () {
describe(‘#parse()’, function () {
it(‘should parse long formed tags’, function () {
var results = tags.parse();
expect(results).equal(4);
});
});
}
);1
25通过以上代码我们知道,它构造一个Tags的describe(组件),这个组件随开发人员定义,并在里面嵌套一个测试parse方法的describ(组件)。并在里面放入了真正要测试的测试用例。参数为测试说明和回调函数。
对于我们而言,Mocha只关心项目结构,对实现以及结果则不太关注,所以我们只需要明白这种结构定义,以及如何使用它,下面我们编写被测试代码。
在lib下新建tags.js文件。放入以下代码
exports = module.exports = {};
exports.parse = function(){
var result=4;
return result;
}1
26以上代码就是我们要测试的代码,我们向外暴露了parse接口,方便测试代码进行调用。我们在终端输入mocha,便可以发现测试通过,这样一个简单的js测试用例便搭建完毕。通常,测试脚本与所要测试的源码脚本同名,但是后缀名为.test.js(表示测试)或者.spec.js(表示规格)。比如,add.js的测试脚本名字就是add.test.js。我们这里并没有严格按照惯例,仅仅作为示例使用。
这些代码将会基于它们所在的describe块运行,你甚至可以使用beforeEach或者afterEach函数来让它们在所有的it块之前或之后运行。这些函数本身仅仅是使用了标准的Node命令来创建或移除文件。让我们再来看看如何使用before以及after吧。
var expect =require(‘chai’).expect;
var tags=require(“../lib/tags”);
describe(‘Tags’, function () {
describe('#parse()', function () {
before(function() {
console.log("本条测试开始!"+1);
});
beforeEach(function(){
console.log("每个it测试我都会执行"+2);
});
it('should parse long formed tags', function () {
var results = tags.parse();
expect(results).equal(4);
});
after(function() {
console.log("本条测试完成了"+3);
});
afterEach(function(){
console.log("每个it执行我都要执行"+4);
});
});
}
);
//我们会看到控制台输出
// Tags
// #parse()
//本条测试开始! 1
//每个it我都要执行 2
// √ should parse long formed tags
//每个it执行我都要执行下 3
//本条测试完成了 4
1 |
|
describe(‘User’, function() {
describe(‘#save()’, function() {
it(‘should save without error’, function(done) {
var user = new User(‘Luna’);
user.save(function(err) {
if (err) throw err;
done();
});
});
});
});`
这里我们测试了user对象的save异步方法。等待它执行完毕后,我们调用Mocha的done函数就会通知Mocha本测试用例跑完了,直接跑下一个。
这是我的第一篇示例博客
1 问题:
为了想明白为什么java可以用
1 | System.out.println(); |
1 | code snippet |
这一句话来输出不同类型的数值,比如数字,字符串,要知道java是强类型语言。
2 实验:
代码
3 原理:
1 | $ hexo server |
More info: Server
Generate static files
1 | $ hexo generate |
More info: Generating
Deploy to remote sites
1 | $ hexo deploy |
More info: Deployment
js高级特性
js极其灵活,我们可以用js来构造我们想要的很多东西,包括java中的类,私有变量,共有方法等。请看以下代码
js实现封装私有变量以及函数
1 | var myObject = ( |
以上就可以实现共有方法和私有变量。ts中的类底层就是如此。
变量作用域的问题
js中的函数内可以访问到函数外部变量,外部却不能访问到函数内部变量。而且在每次函数调用完毕后。在函数体内定义的变量都会被清空。每当函数体内使用一个变量时,函数会先从本函数体内寻找定义,后延伸到外部直到找到为止。下面这段包含了嵌套函数的代码,也许能帮助我们加深对变量搜索过程的理解:
1 | var a = 1; |
异步函数调用
每次我们使用闭包都要谨慎对待闭包中的变量使用。比如:如果在for循环中的函数体是异步操作话,就会存在很多问题。我们看以下代码
1 | nodes[ i ].onclick = function(){ |
这里为什么每次都是输出5呢?因为for循环函数体内为异步操作,在异步操作进行时,for早已经循环完毕。i为5.
我们来看下改进后的代码1
2
3
4
5
6 (function( i ){
nodes[ i ].onclick = function(){
console.log(i);
}
})( i )
};
这里,我们使用闭包将每次的i封在内部,保持每次对它的使用。
下面来看看这段跟闭包相关的代码:
1 | var extent = function(){ |
这里的extent相当于一个对象,有外部接口call方法以及内部私有变量value。闭包很方便的帮助了我们来构建一个对象等等。
More info: Deployment