NodeJs学习笔记(四)---单元测试
./myApp
├── api
├── assets
├── ...
├── test
│ ├── unit
│ │ ├── controllers
│ │ │ └── UserController.test.js
│ │ ├── models
│ │ │ └── User.test.js
│ │ └── ...
│ ├── fixtures
│ ├── ...
│ ├── bootstrap.test.js
│ └── mocha.opts
└── views
首先在根目录下建立test目录,然后一次建立test\unit\controllers和test\unit\models目录。
var Sails = require('sails'),sails;before(function (done) {Sails.lift({log : {level : 'error' //指定错误级别,避免出现调试输出,这主要是用来调试controller}}, function (err, server) {sails = server;if (err)return done(err);// here you can load fixtures, etc.done(err, sails);});});after(function (done) {var done_called = false;Sails.lower(function () {if (!done_called) {done_called = true;setTimeout(function () {sails.log.debug("inside app.lower, callback not called yet. calling.");done();}, 1000);} else {sails.log.debug("inside app.lower, callback already called.");}});});需要注意的是,after()和官方文档的不一致,因为会出现done()调用多次的问题,所以我参考了网上的一个资源,增加了等待。
4)测试控制器(controller)
在test\unit\controllers下建立UserController.test.js,内容如下
var request = require('supertest');
var should = require('should');
describe('UsersController', function () {
describe('#login()', function () {
it('should get 1', function (done) {
request(sails.hooks.http.app)
.get('/user/login?login_code=12345678901&user_password=111111')
.end(function (err, results) {
should(results.res.body.result).be.exactly(1);
done();
});
});
});
});
这里用的是BDD的风格,我比较喜欢这种方式,也可以采用TDD的风格,感觉都差不多
上面的代码也很简单,对/user/login?login_code=12345678901&user_password=111111发起请求,根据返回内容进行判断,这里要注意一下,返回的信息要多于通常的返回,比如我的返回是类似于{result: 1, desc:'登录成功'}之类的,但是supertest返回的要多得多,所以用result.res.body.result才能得到result值,也可以将信息打印出来看一下,不过需要注意的是因为前面设置了log:{level: 'error'},可以看不到输出,可以将error改成info,再试一下。
5)运行测试
"scripts": {"start": "node app.js","debug": "node debug app.js","test": "mocha -t 10000 test/bootstrap.test.js test/unit/**/*.test.js"},这样就可以直接运行npm test执行测试了。需要说明一下, -t 10000代表每个测试的执行时间增加到10秒,默认是2秒,在我的系统上无法返回,会出现错误,可能我的机器太慢了吧。如果用户名密码正确,则返回1 passing (7s)
0 passing (6s)1 failing1) UsersController #login() should get 1:Uncaught AssertionError: expected 0 to be 1+ expected - actual-0+1at Test.<anonymous> (D:\work\nodejs\KangfuMobile\test\unit\controllers\Use rController.test.js:13:40)at net.js:1392:10
var should = require('should');var bcrypt = require('bcrypt');describe('用户表', function () {describe('查找用户信息', function () {it('应该检查用户表是否没有这个用户了', function (done) {User.find({user_code : '12345678901'}).exec(function (err, results) {should(results.length).be.exactly(1);done();});});});describe('查找用户名密码', function () {it('应该检查密码是否录入错误,或者密码加密系统出现错误', function (done) {User.findOne({user_code : '12345678901'}).exec(function (err, user) {var user_password = '111111';var user_password_o = user.user_password;user_password_o = "$2a$" + user_password_o.substr(4);bcrypt.compare(user_password, user_password_o, function (err, comp) {should(comp).be.exactly(true);done();});});});});});上面有两个测试,一个是查看是否存在且只有一个用户名为“12345678901”的用户,第二个是查看其密码是否正确。运行测试命令,得到如下结果,如果没有用户,则会出现下面的错误:2 passing (6s)3 failing1) UsersController #login() should get 1:Uncaught AssertionError: expected 0 to be 1+ expected - actual-0+1at Test.<anonymous> (D:\work\nodejs\KangfuMobile\test\unit\controllers\Use rController.test.js:13:40)at net.js:1392:102) 用户表 查找用户信息 应该检查用户表是否没有这个用户了:Uncaught AssertionError: expected 0 to be 1+ expected - actual-0+1at D:\work\nodejs\KangfuMobile\test\unit\models\Users.test.js:10:31at readableAddChunk (_stream_readable.js:163:16)at Socket.Readable.push (_stream_readable.js:126:10)at TCP.onread (net.js:529:20)3) 用户表 查找用户名密码 应该检查密码是否录入错误,或者密码加密系统出现错误:Uncaught TypeError: Cannot read property 'user_password' of undefinedat D:\work\nodejs\KangfuMobile\test\unit\models\Users.test.js:21:31at readableAddChunk (_stream_readable.js:163:16)at Socket.Readable.push (_stream_readable.js:126:10)at TCP.onread (net.js:529:20)通过上面就可以查看是否出现了错误,并检查可能的问题,如果修改正确了,就会
NodeJs学习笔记(四)---单元测试的更多相关文章
- nodejs学习笔记<四>处理请求参数
在web开发中处理请求参数是个非常常见的工作:nodejs提供了了querystring用来处理请求参数. querystring常用方法有:parse,stringify. (1)parse: 解析 ...
- NodeJS学习笔记四
Generator简介 基本概念 Generator函数有多种理解角度.从语法上,首先可以把它理解成,Generator函数是一个状态机,封装了多个内部状态. 执行Generator函数会返回一个遍历 ...
- nodejs学习笔记四(模块化、在npm上发布自己的模块)
模块化: 1.系统模块: http.querystring.url 2.自定义模块 3.包管理器 [系统模块] Assert 断言:肯定确定会出现的情 ...
- nodejs学习笔记四——express-session
博友沉沉-_-的这篇express 框架之session分析的已经非常详细了,本人这里就不描述了. 总结其中的几个关键点. 1.http协议规定http链接是无状态的链接,cookie和session ...
- Nodejs学习笔记(四)——支持Mongodb
前言:回顾前面零零碎碎写的三篇挂着Nodejs学习笔记的文章,着实有点名不副实,当然,这篇可能还是要继续走着离主线越走越远的路子,从简短的介绍什么是Nodejs,到如何寻找一个可以调试的Nodejs ...
- NodeJS学习笔记 进阶 (12)Nodejs进阶:crypto模块之理论篇
个人总结:读完这篇文章需要30分钟,这篇文章讲解了使用Node处理加密算法的基础. 摘选自网络 Nodejs进阶:crypto模块之理论篇 一. 文章概述 互联网时代,网络上的数据量每天都在以惊人的速 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- Nodejs学习笔记(三)——一张图看懂Nodejs建站
前言:一条线,竖着放,如果做不到精进至深,那就旋转90°,至少也图个幅度宽广. 通俗解释上面的胡言乱语:还没学会爬,就学起走了?! 继上篇<Nodejs学习笔记(二)——Eclipse中运行调试 ...
- Nodejs学习笔记(二)——Eclipse中运行调试Nodejs
前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...
- NodeJS学习笔记之Connect中间件模块(一)
NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...
随机推荐
- 【Java】单词倒序输出
如何将一段单词倒序输出?把"Hello Java Hello China"变成"China Hello Java Hello"? 看起来好像很简单,只需要把字符 ...
- BOM物料清单在输入用料计划时快捷选择物料没有带出单位
问题: 在新增BOM物料清单时,输入用料计划,快捷选择物料没有带出单位,但是从清单查找里面选择物料,是可以自动带出单位的. 原因分析查找: 1.这是个自定义单据,到tools工具上查看相关设置,看清单 ...
- jq实现全选或者全不选
$("#all").click(function () { if($(this).is(":checked")){ $("input[name='pr ...
- 关于苹果APP的上架整理
由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...
- mysql的复杂查询,连接数据库
1.MySQL的工具:Navicat 优点:方便2.数据库的导入 mysqldump -u用户名 -p密码 数据库名称 > 导出文集路径 #结构+数据 mysqldump -u用户名 -p密码 ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- Android OpenGL ES 开发(一): OpenGL ES 介绍
简介OpenGL ES 谈到OpenGL ES,首先我们应该先去了解一下Android的基本架构,基本架构下图: 在这里我们可以找到Libraries里面有我们目前要接触的库,即OpenGL ES. ...
- 机器学习算法 - 支持向量机SVM
在上两节中,我们讲解了机器学习的决策树和k-近邻算法,本节我们讲解另外一种分类算法:支持向量机SVM. SVM是迄今为止最好使用的分类器之一,它可以不加修改即可直接使用,从而得到低错误率的结果. [案 ...
- GO学习——安装编译(1)
学习网站列表: Golang官网:https://golang.org/ Golang标准库文档:https://golang.org/pkg Golang中文标准库文档:https://studyg ...
- 初识分布式计算:从MapReduce到Yarn&Fuxi
这些年,云计算.大数据的发展如火如荼,从早期的以MapReduce为代表的基于文件系统的离线数据计算,到以Spark为代表的内存计算,以及以Storm为代表的实时计算,还有图计算等等.只要数据规模 ...