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 相关文章推荐
jquery 操作单选框,复选框,下拉列表实现代码
Oct 27 Javascript
javascript学习笔记(十六) 系统对话框(alert、confirm、prompt)
Jun 20 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
Aug 02 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
jQuery实现可用于博客的动态滑动菜单
Mar 09 Javascript
原生js和jquery实现图片轮播特效
Apr 23 Javascript
vue.js之vue-cli脚手架的搭建详解
May 05 Javascript
使用Nuxt.js改造已有项目的方法
Aug 07 Javascript
小程序如何构建骨架屏
May 29 Javascript
Vue实现push数组并删除的例子
Nov 01 Javascript
vue改变循环遍历后的数据实例
Nov 07 Javascript
Vue的Options用法说明
Aug 14 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
各种战术和打法的原创者
2020/03/04 星际争霸
PHP的ASP防火墙
2006/10/09 PHP
PHP实现统计所有字符在字符串中出现次数的方法
2017/10/17 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
js实现选中页面文字将其分享到新浪微博
2015/11/05 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
js实现点击图片在屏幕中间弹出放大效果
2019/09/11 Javascript
Vue之Mixins(混入)的使用方法
2019/09/24 Javascript
js实现弹窗效果
2020/08/09 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
解决使用python print打印函数返回值多一个None的问题
2020/04/09 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python自定义sorted排序实现方法详解
2020/09/18 Python
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
如何写一份好的自荐信
2014/01/02 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
工程质量承诺书
2014/03/27 职场文书
英语教师个人工作总结
2015/02/09 职场文书
第一书记观后感
2015/06/08 职场文书
学术会议领导致辞
2015/07/29 职场文书
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python
安装harbor作为docker镜像仓库的问题
2022/06/14 Servers