baobaobao


  • 首页

  • 关于他

  • 博客分类

  • 博客归档

未命名

发表于 2018-06-01 |

未命名

发表于 2018-06-01 |

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
2
3
4
npm install -g mocha      
```

3 接下来,我们为我们的项目创建一个新的文件夹并在其中运行下面的代码:

npm install chai

1
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
2
5通过以上代码我们知道,它构造一个Tags的describe(组件),这个组件随开发人员定义,并在里面嵌套一个测试parse方法的describ(组件)。并在里面放入了真正要测试的测试用例。参数为测试说明和回调函数。  
对于我们而言,Mocha只关心项目结构,对实现以及结果则不太关注,所以我们只需要明白这种结构定义,以及如何使用它,下面我们编写被测试代码。

在lib下新建tags.js文件。放入以下代码
exports = module.exports = {};

exports.parse = function(){

var result=4;
return result;

}

1
2
6以上代码就是我们要测试的代码,我们向外暴露了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
2
3
4
5
6

###2 异步测试用例
我们在测试前台js会经常遇到一些涉异步回调函数的测试。那么如何测试它们呢?Mocha已经给出了很好的方案。

我们只需要在用例函数里边加一个done回调函数(无需定义),异步代码执行完毕后调用一下done,就可以通知mocha,已经执行完毕,去执行下一个用例函数吧!
就像下面这样:

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本测试用例跑完了,直接跑下一个。

这是我的第一篇示例博客

发表于 2018-05-22 |

1 问题:

为了想明白为什么java可以用

1
System.out.println();
java
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高级特性

发表于 2018-05-21 | 分类于 javaScript之美 |

js极其灵活,我们可以用js来构造我们想要的很多东西,包括java中的类,私有变量,共有方法等。请看以下代码

js实现封装私有变量以及函数

1
2
3
4
5
6
7
8
9
10
11
12
13
var myObject = (
function() {
//私有变量
var _name = "私有变量";
return {
//共有方法,暴露的公共接口
getName: function () {
return _name;
}
}
})();
alert(myObject.getName());//输出:“私有变量”
console.log(myObject._name);//输出"undefine"

以上就可以实现共有方法和私有变量。ts中的类底层就是如此。

变量作用域的问题

js中的函数内可以访问到函数外部变量,外部却不能访问到函数内部变量。而且在每次函数调用完毕后。在函数体内定义的变量都会被清空。每当函数体内使用一个变量时,函数会先从本函数体内寻找定义,后延伸到外部直到找到为止。下面这段包含了嵌套函数的代码,也许能帮助我们加深对变量搜索过程的理解:

1
2
3
4
5
6
7
8
9
10
11
12
var a = 1;
var func1 = function(){
var b = 2;
var func2 = function(){
var c = 3;
alert ( b ); // 输出:2
alert ( a ); // 输出:1
}
func2();
alert ( c ); // 输出:Uncaught ReferenceError: c is not defined
};
func1();

异步函数调用

每次我们使用闭包都要谨慎对待闭包中的变量使用。比如:如果在for循环中的函数体是异步操作话,就会存在很多问题。我们看以下代码

i
1
2
3
4
nodes[ i ].onclick = function(){
alert ( i );//输出5
}
};

这里为什么每次都是输出5呢?因为for循环函数体内为异步操作,在异步操作进行时,for早已经循环完毕。i为5.
我们来看下改进后的代码

( var i
1
2
3
4
5
6
 (function( i ){
nodes[ i ].onclick = function(){
console.log(i);
}
})( i )
};

这里,我们使用闭包将每次的i封在内部,保持每次对它的使用。

下面来看看这段跟闭包相关的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
var extent = function(){
var value = 0;
return {
call: function(){
value++;
console.log( value );
}
}
};
var extent = extent();
extent.call(); // 输出:1
extent.call(); // 输出:2
extent.call(); // 输出:3

这里的extent相当于一个对象,有外部接口call方法以及内部私有变量value。闭包很方便的帮助了我们来构建一个对象等等。

More info: Deployment

1…1011
鲍志强

鲍志强

求道者

104 日志
19 分类
15 标签
GitHub E-Mail 知乎
© 2016 — 2019 baobaobao
主题 — NexT.Pisces v5.1.4