量角器抛出'TypeError:在请求回调时无法读取'undefined'属性'statusCode'

时间:2017-02-23 13:50:13

标签: node.js selenium-webdriver request protractor automated-tests

我正在使用量角器编写UI测试,我直接通过RESTful服务而不是使用UI上传文件。我有以下方法

var defer = protractor.promise.defer();
request(options, function (error, response, body) {
    if (!error && response.statusCode == 201) {
        var info = JSON.parse(body);
        defer.fulfill(info);
    } else {
        defer.reject({
            error: error,
            message: response.statusCode
        });
    }
});
return defer.promise;

注意:如果成功上传,API将返回201.

通过我的IDE(在Windows中)运行代码时工作正常,但我想通过Jenkins(通过Ubuntu)运行测试,在这种情况下我收到错误:

E/launcher - TypeError: Cannot read property 'statusCode' of undefined
    at Request._callback (file.js:144:34)
    at self.callback (/workspace/node_modules/request/request.js:186:22)
    at emitOne (events.js:101:20)
    at Request.emit (events.js:188:7)
    at Request.onRequestError (/workspace/node_modules/request/request.js:845:8)
    at emitOne (events.js:96:13)
    at ClientRequest.emit (events.js:188:7)
    at Socket.socketErrorListener (_http_client.js:310:9)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:188:7)
E/launcher - Process exited with error code 199

我不确定这是否与某种配置有关,或者是否可能导致此问题,但我确实需要指导。

1 个答案:

答案 0 :(得分:0)

你永远不应该同时得到错误和回应,所以:

    defer.reject({
        error: error,
        message: response.statusCode
    });

将尝试检查响应的statusCode,当error为true时,该响应是未定义的。也许试试这个:

    defer.reject({
        error: error,
        message: response ? response.statusCode : null
    });

或类似的东西。

但最好分别处理3个案例:

if (error) {
    defer.reject({
        error: error
    });
} else if (response.statusCode === 201) {
    var info = JSON.parse(body);
    defer.fulfill(info);
} else {
    defer.reject({
        message: response.statusCode
    });
}

或者也许:

if (error) {
    defer.reject({
        error: error
    });
} else if (response.statusCode === 201) {
    var info = JSON.parse(body);
    defer.fulfill(info);
} else {
    defer.reject({
        error: 'Bad status code: ' + response.statusCode
    });
}

或类似的东西。

然后你会知道你的错误是什么,因为它目前没有在响应中返回错误,因为它在有机会之前崩溃了。

现在,错误很可能是因为没有连接到主机或类似的东西。