[Node & Testing] Intergration Testing with Node Express

We have express app:

import _ from ‘lodash‘
import faker from ‘faker‘
import express from ‘express‘
import bodyParser from ‘body-parser‘
import getTokenFromHeader from ‘../../src/routes/utils/get-token-from-header‘

export default startServer

const users = _.times(20, () => faker.helpers.contextualCard())
const userAuth = {
  username: ‘jane‘,
  password: ‘I have a secure password‘,
}
const user = {
  token: ‘Wanna-hear-a-secret?-I-sometimes-sing-in-the-shower!‘,
}

function startServer() {
  const app = express()

  app.use(bodyParser.json())

  function auth(req, res, next) {
    const token = getTokenFromHeader(req)
    if (!token || token !== user.token) {
      res.sendStatus(401)
    } else {
      next()
    }
  }

  const userRouter = express.Router()
  userRouter.get(‘/‘, (req, res) => {
    const {query: {limit = 20, offset = 0}} = req
    res.json({users: _.take(users.slice(offset), limit)})
  })

  // Preload user objects on routes with ‘:username‘
  userRouter.param(‘username‘, (req, res, next, param) => {
    req.user = users.find(({username}) => username === param)
    next()
  })

  userRouter.get(‘/:username‘, (req, res) => {
    if (req.user) {
      res.json({user: req.user})
    } else {
      res.sendStatus(404)
    }
  })

  userRouter.post(‘/‘, auth, (req, res) => {
    users.unshift(req.body.user)
    res.json({user: users[0]})
  })

  userRouter.delete(‘/:username‘, auth, (req, res) => {
    users.splice(users.indexOf(req.user), 1)
    res.json({success: true})
  })

  const authRouter = express.Router()
  authRouter.post(‘/‘, (req, res) => {
    if (
      req.body.username === userAuth.username &&
      req.body.password === userAuth.password
    ) {
      res.json({user})
    } else {
      res.sendStatus(401)
    }
  })

  const apiRouter = express.Router()
  apiRouter.use(‘/users‘, userRouter)
  apiRouter.use(‘/auth‘, authRouter)

  app.use(‘/api‘, apiRouter)

  return new Promise(resolve => {
    const server = app.listen(3001, () => {
      resolve(server)
    })
  })
}

As you can see, we wrap Express App into a function ‘startServer‘ and export it as default export. The return value of this function is the server which wrap into a Promise.

The good part for doing this way is that we can start and stop server whenever we want to prevent menory leak or "ADDRESS IN USED" problem.

import startServer from ‘../start-server‘
import axios from ‘axios‘

let server

beforeAll(async () => {
    server = await startServer()
})

afterAll(done => server.close(done))

test(‘can get users‘, async () => {
    const user = await axios
        .get(‘http://localhost:3001/api/users‘)
        .then(response => response.data.users[0])

    // toMatchObject, to check whether user object
    // has ‘name‘ prop which is a string
    // and ‘username‘ prop which is a string
    // this is a subset, doesn‘t need to match all the object props
    expect(user).toMatchObject({
        name: expect.any(String),
        username: expect.any(String)
    })
})

// Test offset and limit should work
// first get 5 users
// then get last two users by given limit and offset
// then check tow users and equal to last tow user in five users.
test(‘get users, limit and offset should work‘, async () => {
    const fiveUsersPromise = axios
        .get(‘http://localhost:3001/api/users?limit=5‘)
        .then(response => response.data.users)
    const twoUsersPromise = axios
        .get(‘http://localhost:3001/api/users?limit=2&offset=3‘)
        .then(response => response.data.users)

    const response = await Promise
        .all([fiveUsersPromise, twoUsersPromise])
    const [fiveUsers, twoUsers] = response
    const [, , ,firstFiveUser, secondFiveUser] = fiveUsers
    const [firstTwoUser, secondTwoUser] = twoUsers
    expect(firstTwoUser).toEqual(firstFiveUser)
    expect(secondFiveUser).toEqual(secondTwoUser)
})

In the test, we call ‘beforeAll‘ to start the server and ‘afterAll‘ to close the server.

时间: 2024-10-10 08:25:39

[Node & Testing] Intergration Testing with Node Express的相关文章

【node.js】本地模式安装express:'express' 不是内部或外部命令,也不是可运行的程序或批处理文件。

今天闲来无事想起了node.js,因此到网上下载了一个node.js的安装程序进行安装.其中: 安装程序:node-v0.11.13-x64.msi PC系统:Windows 7 自定义安装路径:D:\TOOLS\NodeJs 安装完成后,执行: D:\TOOLS\NodeJs>node -v v0.11.13 安装框架express,从网站上下载了一个安装文档,说安装express可分全局模式和本地模式,个人觉得全局模式就是默认的没什么意思,就选择本地模式进行安装,执行: D:\TOOLS\N

node.js高级编程|node.js 视频教程_基于node.js+Express.js+Jade+MongoDB实战开发

基于node.js+Express.js+Jade+MongoDB开发Web即时聊天系统课程讲师:幻星课程分类:前端开发适合人群:初级课时数量:36课时更新程度:完成用到技术:Node.js NPM. Express.NoSQL,MongoDB涉及项目:匿名聊天网站系统node.js视频教程:http://www.ibeifeng.com/goods-462.htmlnode.js 教程适合人群:node.js视频教程要求学员了解JavaScript,node.js入门教程适合希望更深入的学习N

征服大前端第二季(Node.js、Angular 4、Express 4、Keystone 4)

征服大前端第二季(Node.js.Angular 4.Express 4.Keystone 4.MongoDB.MySQL)网盘地址:https://pan.baidu.com/s/1RFi_3H9vLXM3-2Glv4SGvA 密码: vhut备用地址(腾讯微云):https://share.weiyun.com/5JkpoZb 密码:dqn36n Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具"Native App良好用户交互体验

探秘Node.js(一)——Node.js简介及安装配置

1.Node.js 简介及特点: Node.js 是一个可以让 JavaScript 运行在服务器端的平台,它可以让JavaScript 脱离浏览器的束缚运行在一般的服务器环境下,就像运行 Python. Perl. PHP. Ruby 程序一样.我们可以用 Node.js 轻松地进行服务器端应用开发,Python. Perl. PHP. Ruby 能做的事 Node.js 几乎都能做,而且可以做得更好. Node.js 最大的特点就是采用异步式 I/O 与事件驱动的架构设计.对于高并发的解决方

node.js教程基础:node.js包管理器

Node.js 包管理器 Node程序包管理器提供了两个主要功能: 1) 它提供了可在search.nodejs.org上搜索的node.js软件包/模块的在线存储库. 2) 它还提供了命令行实用程序,用于安装Node.js软件包,执行版本管理和Node.js软件包的依赖关系管理. 在v0.6.3之后的版本中,npm与Node.js可安装程序捆绑在一起. 您可以通过打开Node.js命令提示符并键入以下命令来检查版本: npm version 使用npm安装模块 以下是安装任何Node.js模块

Node.js学习(1):Node.js 和Socket.IO 实现chat

使用 Node.js 和 Socket.IO 构建简单的聊天程序 在node.js根目录下创建文件夹chat,里面添加两个文件:app.js和index.html app.js var fs = require('fs') , http = require('http') , socketio = require('socket.io'); var server = http.createServer(function(req, res) { res.writeHead(200, { 'Cont

Node: Updating npm's bundled node gyp

Linux, Mac OS X, Solaris, etc. Unix is easy. Just run the following command. Use sudo if necessary. $ [sudo] npm explore npm -g -- npm install [email protected] From: http://lovewindy.com/node-updating-npms-bundled-node-gyp/ Node: Updating npm's bund

[转载]Node入门 » 一本全面的Node.js教程

http://www.nodebeginner.org/index-zh-cn.html 作者: Manuel Kiessling 翻译: goddyzhao & GrayZhang & MondayChen 关于 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识.本书绝不是一本“Hello World”的教程. 状态 你正在阅读的已经是本书的最终版.因此,只有当进行错误更正以及针对新版本Node.js的改动进行对应的修正时,才会进行

node.js入门系列(一)--Node.js简介

什么是NodeJS JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器. 每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情.例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了document之类的内置对象.而运行在NodeJS中的JS的用途是操作磁盘文件或搭建HTTP服务器,NodeJS就相应提供了fs.