转自http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html

众所周知对于任何一个项目来说,做好单元测试都是必不可少的一项工作。今天在逛CnodeJs社区的时候,无意中看到一篇介绍nodejs测试工具mocha的贴子。于是自己捣鼓了一阵之后,好像还蛮有趣的样子,因此把我摸索入门的过程记录下来跟大家分享一下:

   1、准备工作

  •   先新建一个项目文件夹,命名为simpleTest。
  •   然后在simpleTest文件夹中创建一个名为test的文件夹,将来用来测试的脚本都放在这个文件夹里面

   2、模块安装

  首先使用npm以全局方式安装mocha模块:

sudo npm install -g mocha

  然后通过命令行进入到simpleTest文件夹中,安装should模块:

sudo npm install should

   3、简单实例

  准备工作就绪之后,我们可以开始来尝试一些简单的实例,看看我们是如何使用mocha和should.js是进行测试工作的。可以直接先在项目根目录下执行mocha命令,看看有什么情况发生,执行后的结果如下图所示:

  

  运行了,但是什么都没有发生。因为mocha扫描了test文件夹,没有发现可以执行的测试脚本文件。下面我们往test目录中添加一个名为test.js的测试文件,代码如下:

 1 require("should");
2
3 var name = "zhaojian";
4
5 describe("Name", function() {
6 it("The name should be zhaojian", function() {
7 name.should.eql("zhaojian");
8 });
9 });
10
11 var Person = function(name) {
12 this.name = name;
13 };
14 var zhaojian = new Person(name);
15
16 describe("InstanceOf", function() {
17 it("Zhaojian should be an instance of Person", function() {
18 zhaojian.should.be.an.instanceof(Person);
19 });
20
21 it("Zhaojian should be an instance of Object", function() {
22 zhaojian.should.be.an.instanceof(Object);
23 });
24 });
25 describe("Property", function() {
26 it("Zhaojian should have property name", function() {
27 zhaojian.should.have.property("name");
28 });
29 });

然后重新执行mocha命令,得到的结果如下:

  

可以看到控制台上已经显示四个测试用例都成功通过了。如果有测试用例没有通过的话,例如我们加上判断name是不是等于epson的语句,控制台的显示如下:

    

  控制台中的信息会明确地告诉我们有多少个测试用例没有通过,并且指出没有通过的测试用例是在哪个模块中的哪个单元。

  接下来我们来分析一下之前的代码,首先为了使用should.js的断言库,在代码的开头部分必须引入should模块,但是mocha模块则无需显式引入。

  每一个describe语句都可以看作是一个测试模块,它只是起着划分各个模块部分的作用,describe语句的第一个参数就是对该模块的描述。

  在describe语句中的it语句才是测试的主体部分,每一个it语句都是一个测试单元,一个测试模块中可以有很多个测试单元。it语句的第一个参数的作用就是描述该单元的测试任务或要求,以便在测试用例数量较多时可以清楚地知道究竟有哪些功能的测试没有通过。

  在it语句的回调函数中就可以通过书写should.js断言库中的语句进行测试了。should模块是assert模块的扩展,它的语法可以在上面的代码中看到,都是类似zhaojian.should.be.an.instanceof(Person) 这样的,跟我们日常用的语法几乎一模一样, 非常易于使用。由于篇幅的关系,我只在前面举了一些简单的例子,有关更多should.js的用法可以参考这里的文档: https://github.com/visionmedia/should.js。另外mocha也可以与其他的第三方断言库搭配使用,在这里就不过多介绍了,有兴趣的话可以自己去看。接下来将介绍如何对异步函数进行测试的例子。

   4、异步测试

  接下来为了进行异步测试,在test目录下创建一个名为testReadFile.js的文件,代码如下:

 1 var fs = require("fs");
2 require("should");
3
4 describe("readFile", function() {
5 it("The file content should be zhaojian", function(done) {
6 fs.readFile("text.txt", "utf8", function(err, data) {
7 data.should.eql("zhaojian");
8 done();
9 });
10 });
11 });

  再创建一个名为text.txt的文本文件,其内容如下:

  

  执行mocha命令进行测试,结果如下:

  

  观察上面的代码,有一点必须注意的是:在进行异步测试的时候,it语句的回调函数会带有一个参数done。我们必须在要测试的异步函数的回调函数的最后加上done()这一句,否则测试就会出错,因为测试不等异步函数执行完毕就结束了。

14.mocha+should.js的更多相关文章

  1. 14条最佳JS代码编写技巧

    http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...

  2. 14个优秀 JS 前端框架、库、工具及其使用时机

    这篇文章主要描述现今流行的一些 Javascript web 前端框架,库以及它们的适用场景. 新的 Javascript 库层出不穷,从而Web 社区愈发活跃.多样.在多方面快速发展.详细去描述每一 ...

  3. 关于14道魔鬼js考题的整理

    1.(function(){ return typeof arguments })(); 这里返回时是argument类型,它是个类数组,也就对象,所以是object,准确谁是[object argu ...

  4. e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector

    Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...

  5. nodejs通过mocha处理运行文件路径下所有js文件

    1.获取文件路径: 方式一:整个js文件使用 var path=require('path');var public_path=path.resolve('../testcase/listData/* ...

  6. Practical Node.js (2018版) 第3章:测试/Mocha.js, Chai.js, Expect.js

    TDD and BDD for Node.js with Mocha TDD测试驱动开发.自动测试代码. BDD: behavior-driven development行为驱动开发,基于TDD.一种 ...

  7. 测试驱动开发(TDD)及测试框架Mocha.js入门学习

    组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅 ...

  8. 使用Node.js完成的第一个项目的实践总结

    http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...

  9. mocha测试框架-truffle

    https://mochajs.org/
学习网址:
https://www.jianshu.com/p/9c78548caffa
https://www.jb51.net/article/10646 ...

随机推荐

  1. 机器学习之&&Andrew Ng课程复习--- 聚类——Clustering

    第十三章.聚类--Clustering ******************************************************************************** ...

  2. 取消记录tableView选中效果

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self. ...

  3. HDUOj 看病要排队 优先队列的使用 题目1873

    STL优先队列的具体描写叙述 http://blog.csdn.net/yueloveme/article/details/47106639 题目地址:http://acm.hdu.edu.cn/s ...

  4. MainWndProc运行观察(有待研究)

    MainWndProc运行观察 把MainWndProc改写成如下代码,便于观察:procedure TWinControl.MainWndProc(var Message: TMessage);be ...

  5. iOS定义静态变量、静态常量、全局变量

    静态变量 当我们希望一个变量的作用域不仅仅是作用域某个类的某个对象,而是作用域整个类的时候,这时候就可以使用静态变量. staticstatic修饰的变量,是一个私有的全局变量.C或者Java中sta ...

  6. 4K 对齐与固态硬盘检测工具

    0. 硬盘扇区 当前电脑传统机械硬盘的每个扇区一般大小为 512 字节(512B):当使用某一文件系统将硬盘格式化时,文件系统会将硬盘扇区.磁道与柱面统计整理并定义一个簇为多少扇区方便快速存储. 现时 ...

  7. void空类型指针

    ; double db = 120.3; void *p; p = &num; cout << *(int *)p << endl;//转换成int类型的指针,再取值 ...

  8. 模仿百度首页“元宵节汤圆”动图(js的定时任务:setInterval)

    模仿百度首页“元宵节汤圆”动图:(js的定时任务:setInterval) 原理:需要一张切图,通过不断定位使得图片就像一帧一帧的图片在播放从而形成了动画 效果图: 切图地址: https://ss1 ...

  9. 头像文件上传 方法一:from表单 方法二:ajax

    方法一:from表单 html 设置form表单,内包含头像预览div,内包含上传文件input 设置iframe用来调用函数传参路径 <!--表单提交成功后不跳转处理页面,而是将处理数据返回给 ...

  10. Codeforces 987A. Infinity Gauntlet(手速题,map存一下输出即可)

    解法: 1.先将对应的字符串存入map. 2.然后将输入的串的second置为空. 3.输出6-n,输出map中的非空串. 代码: #include <bits/stdc++.h> usi ...