Node.js环境下Koa2添加travis ci持续集成工具的方法


Posted in Javascript onJune 19, 2017

前言

因为最近使用koa2做项目测试开发,所以想整合下travis ci,网上资料也比较少,于是自己就整了个,做个记录。分享出来供大家参考学习,下面来看看详细的介绍吧。

方法如下:

先来看下travis.yml的配置

language: node_js
node_js:
 - "6"
before_script:
 - ./node_modules/.bin/knex migrate:latest --knexfile='./app/knexfile.js'
script:
 - npm run test

因为是接口测试,所以首先需要做表创建等操作。

测试的命令:

NODE_ENV=production NODE_CONFIG_DIR='./app/config/' ./node_modules/.bin/mocha --require 'babel-polyfill' --compilers js:babel-register ./app/test/**/*.js

主要是测试这里,使用了supertest,大概看下是如何调用的。

const request = require('supertest');
const should = require('should');
const index = require('../../index');

let app = request(index.listen());

describe('/api/persons', function() {
 let personId;

 it('POST /api/persons - create person success and respond with 200', function(done) {
 app.post('/api/persons')
  .send({
  'firstName': 'Jennifer',
  'lastName': 'Lawrence',
  'age': 24
  })
  .expect(200)
  .expect(function(res) {
  (res.body.id > 0).should.be.true;
  })
  .end(function(err, res) {
  if (err) {
   return done(err);
  }

  let resJson = JSON.parse(res.text);
  personId = resJson.id;

  done();
  })
 });

 it('GET /api/persons - fetch persons item', function(done) {
 app.get('/api/persons')
  .expect(200)
  .expect(function(res) {
  (res.body.length > 0).should.be.true;
  })
  .end(function(err, res) {
  if (err) {
   return done(err);
  }

  done();
  })
 });

 it('GET /api/persons/:id - fetch a person', function(done) {
 app.get(`/api/persons/${personId}`)
  .expect(200)
  .expect(function(res) {
  (res.body.id == personId).should.be.true;
  })
  .end(function(err, res) {
  if (err) {
   return done(err);
  }

  done();
  })
 });

 it('DELETE /api/persons/:id - delete a person', function(done) {
 app.delete(`/api/persons/${personId}`)
  .expect(200)
  .end(function(err, res) {
  if (err) {
   return done(err);
  }

  done();
  })
 });

 it('GET /api/persons/:id - fetch a person should 404', function(done) {
 app.get(`/api/persons/${personId}`)
  .expect(404)
  .end(function(err, res) {
  if (err) {
   return done(err);
  }

  done();
  })
 });

});

这里主要注意的是

const index = require('../../index');

需要将koa实例暴漏出来,不然在做travis ci的集成后,启动了项目,测试的时候依然找不到具体访问地址。

来看下我的index.js

import Knex from 'knex';
import {
 Model
} from 'objection';
import knexConfig from './knexfile';
import config from 'config';
import Koa from 'koa';
import koaLogger from 'koa-logger';
import bodyParser from 'koa-bodyparser';
import render from 'koa-ejs';
import co from 'co';
import koaStatic from "koa2-static"
import router from './router';

const path = require('path');

// initial knex
const knex = Knex(knexConfig.development);
Model.knex(knex);

// initial app
const app = new Koa();

// initial render
render(app, {
 root: path.join(__dirname + '/view'),
 layout: 'template',
 viewExt: 'ejs',
 cache: true,
 debug: true
});
app.context.render = co.wrap(app.context.render);

// initial static

app.use(koaLogger())
 .use(bodyParser())
 .use(router.routes())
 .use(koaStatic({
 path: '/web',
 root: __dirname + "/../static"
 }));

module.exports = app;

需要注意的是这里的

module.exports = app;

暴漏出来,再supertest中才可以独立启动server测试。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
纯js分页代码(简洁实用)
Nov 05 Javascript
浅析JavaScript中的delete运算符
Nov 30 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
javascript 闭包详解
Jul 02 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
使用bootstrap实现多窗口和拖动效果
Sep 22 Javascript
vue--点击当前增加class,其他删除class的方法
Sep 15 Javascript
微信小程序实现左右列表联动
May 19 Javascript
layui自定义ajax左侧三级菜单
Jul 26 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
vue简单封装axios插件和接口的统一管理操作示例
Feb 02 Javascript
简单聊聊TypeScript只读修饰符
Apr 06 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 #Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
Jun 19 #Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
Jun 19 #Javascript
jQuery自定义多选下拉框效果
Jun 19 #jQuery
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
Jun 19 #Javascript
JS仿淘宝搜索框用户输入事件的实现
Jun 19 #Javascript
jQuery实现下拉菜单的实例代码
Jun 19 #jQuery
You might like
ThinkPHP之R方法实例详解
2014/06/20 PHP
浅谈php提交form表单
2015/07/01 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
php使用curl并发减少后端访问时间的方法分析
2016/05/12 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
JavaScript DOM 学习第九章 选取范围的介绍
2010/02/19 Javascript
鼠标放在图片上显示大图的JS代码
2013/03/26 Javascript
8个超实用的jQuery功能代码分享
2015/01/08 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
简单讲解AngularJS的Routing路由的定义与使用
2016/03/05 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
Vue.js实现拖放效果的实例
2016/09/30 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
2020/07/19 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python中的unittest框架实例详解
2021/02/05 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
我爱我家教学反思
2014/05/01 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
村班子对照检查材料
2014/08/18 职场文书
首席执行官观后感
2015/06/03 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
图神经网络GNN算法
2022/05/11 Python