如何使用Jasmine执行nodeJS集成测试?

时间:2017-07-16 17:49:22

标签: node.js jasmine automated-tests

我有一个用nodeJS编写的服务器应用程序作为REST Api。对于单元测试,我使用Jasmine,我想用一些模拟数据执行一些集成测试。像这样的测试:

从" ../ support / api-test-client";

导入ApiTestClient
import User from "../../src/model/user";

describe("GET /users", () => {

    it("returns an array with all users", done => {
        ApiTestClient
            .getUsers()
            .then(users => {
                expect(users).toEqual(jasmine.any(Array));
                done();
            })
            .catch(err => fail(err));
    });

});

使用正常的单元测试我只能模拟API调用,但在这种情况下,我必须首先运行服务器应用程序,打开2个终端,一个用于npm start,然后另一个用于npm test

到目前为止,我已尝试将此预测试脚本添加到package.json

"pretest": "node dist/src/server.js &"

因此,该过程在后台运行,但它感觉不对,因为它将在测试套件结束后运行。

如何自动启动/停止服务器应用程序以运行此集成测试?

1 个答案:

答案 0 :(得分:1)

我找到了一种简单的方法,可以使用beforeEach在套件之前启动express

注意:这已在jasmine 2.6.0express 4.15.3

上进行了测试

最小例子:

//server.js 
const express = require('express')
const app = express()

app.get('/world', function (req, res) {
  res.send('Hello World!')
})

app.get('/moon', function (req, res) {
  res.send('Hello Moon!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})



//spec/HelloSpec.js
var request = require("request");

describe("GET /world", function() {
  beforeEach(function() {
    //we start express app here
    require("../server.js");
  });


  //note 'done' callback, needed as request is asynchronous
  it("returns Hello World!", function(done) {
    request("http://localhost:3000/world", function(error, response, html){
      expect(html).toBe("Hello World!");
      done();
    });
  });

  it("returns 404", function(done) {
    request("http://localhost:3000/mars", function(error, response, html){
      expect(response.statusCode).toBe(404);
      done();
    });
  });

});

使用jasmine命令运行后,它返回预期的:

Started
Example app listening on port 3000!
..


2 specs, 0 failures
Finished in 0.129 seconds

服务器关闭(端口3000也关闭)

我希望这会有所帮助。