1

我正在尝试测试基于 express 的 node.js 应用程序。我想返回一个简单的 404.html,我可以成功地做到这一点,但是之后,在节点 http 服务器上调用 close 会得到这个错误:

Fatal error: Cannot call method 'call' of undefined

我很难追查到底是什么,undefined因为在其他地方调用相同的方法时效果很好。

这是我的快速代码:

function Server() {
    this.port = 9000;
    this.staticDir = '/public';
}

function handleHomeRequest(req, res) {
    var body = '<html><body>Home Page.</body></html>';
    res.send(body);
}

Server.prototype.start = function () {
    expServer = express();

    expServer.get('/', function (req, res) { handleHomeRequest(req, res); });
    expServer.use(function (req, res) {
        res.status(404).sendfile('./src/public/404.html');
    });

    runningServer = expServer.listen(this.port);
};

Server.prototype.stop = function (cb) {
    runningServer.close(cb);
};

这是我的nodeunit测试代码:

var ROOT_URL = 'http://localhost',
    PORT = 9000,
    URL = ROOT_URL + ':' + PORT + '/',
    http = require('http'),
    Server = require('./server.js'),
    server;

exports.setUp = function(done) {
    server = new Server();
    done();
};

exports.tearDown = function (done) {
    server = null;
    done();
};

exports['Requesting a page that does not exist results in a 404.'] = function (test) {
    server.start();
    httpGet(URL + 'guaranteedNotToExistPage', function(res, data) {
        test.equal(404, res.statusCode, 'Requesting a page that dne did not return with a status code of 404.');
        test.ok(data.indexOf('404 Page Not Found') > -1, 'The 404 page was not returned.');
        //test.done();
        server.stop(test.done);
    });
};

function httpGet(url, callback) {
    var request = http.get(url),
        receivedData = '';
    request.on('response', function (response) {
        response.setEncoding('utf8');
        response.on('data', function (chunk) {
            receivedData += chunk;
        });
        response.on('end', function () {
            callback(response, receivedData);
        });
    });
}

http get 请求的结果回来了,失败只在我调用时发生,server.stop(test.done);但是需要停止服务器以确保我的单元测试可以按任何顺序独立运行。

4

1 回答 1

0

首先, runningServer 是在哪里定义的?我看不到一个

var runningServer;

在第一个和平的代码中的任何地方。因此,如果您在prototype.start 中写入一个值,我怀疑您是否可以在不同范围的prototype.stop 上访问它。

其次,节点 0.6 中的 {expressListener}.close() 只是同步的,他们在 0.8 上添加了回调。因此,请检查 node.js 版本以确保正确处理 {cb}。

于 2013-11-17T18:17:27.620 回答