考虑以下代码在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或其他框架中是否有办法做到这一点?
单元测试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)