14.mocha+should.js
转自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的更多相关文章
- 14条最佳JS代码编写技巧
http://gaohaixian.blog.163.com/blog/static/123260105201142645458315/写任何编程代码,不同的开发者都会有不同的见解.但参考一下总是好的 ...
- 14个优秀 JS 前端框架、库、工具及其使用时机
这篇文章主要描述现今流行的一些 Javascript web 前端框架,库以及它们的适用场景. 新的 Javascript 库层出不穷,从而Web 社区愈发活跃.多样.在多方面快速发展.详细去描述每一 ...
- 关于14道魔鬼js考题的整理
1.(function(){ return typeof arguments })(); 这里返回时是argument类型,它是个类数组,也就对象,所以是object,准确谁是[object argu ...
- e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector
Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...
- nodejs通过mocha处理运行文件路径下所有js文件
1.获取文件路径: 方式一:整个js文件使用 var path=require('path');var public_path=path.resolve('../testcase/listData/* ...
- 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.一种 ...
- 测试驱动开发(TDD)及测试框架Mocha.js入门学习
组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅 ...
- 使用Node.js完成的第一个项目的实践总结
http://blog.csdn.net/yanghua_kobe/article/details/17199417 项目简介 这是一个资产管理项目,主要的目的就是实现对资产的无纸化管理.通过为每个资 ...
- mocha测试框架-truffle
https://mochajs.org/ 学习网址: https://www.jianshu.com/p/9c78548caffa https://www.jb51.net/article/10646 ...
随机推荐
- android 联系人中,在超大字体下,加入至联系人界面(ConfirmAddDetailActivity)上有字体显示不全的问题
联系人(Contacts)中,在超大字体下.加入至联系人界面 (ConfirmAddDetailActivity)上有字母显示不全,如"j"等 这是android布局比較紧凑引起的 ...
- Mongodb简单介绍
1. 简单介绍 Mongodb是一种强大.灵活,可扩展的数据存储方式.属于nosql.非关系型数据库的一种. mongodb是面向文档的数据库. 尽管是非关系型数据库.可是它保留了很多关系型数据库的特 ...
- bzoj1305: [CQOI2009]dance跳舞(二分答案+网络流)
1305: [CQOI2009]dance跳舞 题目:传送门 题解: 一眼网络流基础建模...然后就GG了 二分答案+拆点建边+最大流判断: 把男女生拆为男1,男2,女1,女2 1.男1和男2还有女1 ...
- RSA in .net and dotnet core
dotnet RSAParameters Struct https://docs.microsoft.com/zh-cn/dotnet/api/system.security.cryptography ...
- 93.快速搭建Web环境 Angularjs + Express3 + Bootstrap3
转自:https://www.cnblogs.com/wawahaha/p/3946023.html 前言 Angularjs越用越顺手,不仅代码量比jQuery少很多,而且实现思路特别清晰,构建大型 ...
- MYSQL 5.7 MHA(GTID+ROW)部署及failover,online_change实战演练
文章结构如下: 1.MHA简介 Masterhigh availability manager and toolsfor mysql,是日本的一位mysql专家采用perl语言编写的一个脚本管理工具, ...
- JavaScript学习记录三
title: JavaScript学习记录三 toc: true date: 2018-09-14 23:51:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...
- elementUI 易错点
1.element table里面添加单选时,如果存在下拉框的筛选功能,那么每次下拉框筛选条件变化时 都得清空之前选中的信息,如果不数据更新后如果更新后的数据跟之前选中的相同 则会无法选中
- The Structure of an App-ios应用架构-MVC
During startup, the UIApplicationMain function sets up several key objects and starts the app runnin ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...