单元测试一个REST控制器,检查它是否返回一个硬编码的respose。

问题描述 投票:0回答:1

考虑以下代码在node.jsexpress.js Rest API实现中。在对host:port进行GET调用后,它返回一些硬编码的内容。

var logger = require('../utilities/loggers')

exports.root_get = function(req, res) {
  res.writeHead(200, {'Content-Type': 'application/json'});
  res.write(JSON.stringify({Application: "NodeTours", Version: "2.0.0", Host: host, Port: port}));
  res.end();
}

这个测试检查它是否可以被调用。

  context('/', function() {
    var root = require('../controllers/root')  
    it('should call / GET controller', function() {
      var res;
      spy = root.root_get = sinon.spy()
      root.root_get(null, res);
      expect(spy.calledOnce).to.equal(true);
    })
  })

我希望能够对它是否提供了预期的(硬编码)响应进行单元测试。在sinon或其他框架中是否有办法做到这一点?

node.js rest unit-testing express sinon
1个回答
0
投票

单元测试Express处理程序的一种方法是用一个模拟的方法来调用它。http.ServerResponse. 比如说。

const assert = require('assert')
const http = require('http')
const handler = require('./root_get')

const req = {}
const res = new http.ServerResponse(req)
handler(req, res)

assert(res.statusCode === 200)

另一个选择是利用 超级试题 库(编辑:正如你正确评论的那样,它更像是一个集成测试库)。它可以在任何 http.Server 并对得到的回答进行论断。有些人可能会说它更有表现力(请看一下我们的网站上的 文件 以获得可以执行的断言的详尽列表)。)

在你的例子中,如果你想断言你的路由返回的是个 200:

const express = require('express');
const request = require('supertest');
const handler = require('./root_get')

const app = express();
app.get("/", handler);

request(app)
  .get("/")
  .expect(200)
© www.soinside.com 2019 - 2024. All rights reserved.