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 使用手册(四)
Sep 23 Javascript
通过身份证号得到出生日期和性别的js代码
Nov 23 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
javascript 弹出的窗口返回值给父窗口具体实现
Nov 23 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
Feb 13 Javascript
vue切换菜单取消未完成接口请求的案例
Nov 13 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php获取地址栏信息的代码
2008/10/08 PHP
php5.3 注意事项说明
2013/07/01 PHP
ThinkPHP公共配置文件与各自项目中配置文件组合的方法
2014/11/24 PHP
php实现zip文件解压操作
2015/11/03 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
js 获取页面高度和宽度兼容 ie firefox chrome等
2014/05/14 Javascript
JavaScript中的small()方法使用详解
2015/06/08 Javascript
JavaScript中setUTCFullYear()方法的使用简介
2015/06/12 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
js链表操作(实例讲解)
2017/08/29 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
vue轻量级框架无法获取到vue对象解决方法
2019/05/12 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
原生JS实现九宫格抽奖
2020/09/13 Javascript
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
通过PHP与Python代码对比的语法差异详解
2019/07/10 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
关于Python错误重试方法总结
2021/01/03 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
阿里巴巴美国:Alibaba美国
2019/11/24 全球购物
商务专员岗位职责范本
2014/06/29 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
2015年党风廉政建设工作总结
2015/04/09 职场文书