我正在使用请求软件包请求URL并使用延期承诺:
getMonitoredPageName = function () {
var deferredExecutor = protractor.promise.defer();
var defer = protractor.promise.defer();
request('http://google.com',
function (error, response, body) {
if (error || response.statusCode ==400) {
defer.reject(response.statusCode);
} else {
defer.fulfill(response.statusCode);
}
});
return defer.promise;
}
我正在从测试中调用上述功能为:
it('should log the page name of every page view in the wizard', function () {
// We opened the first page of the wizard and we expect it to have been logged
expect(heartBeatNotification.getMonitoredPageName()).toBeTruthy(true);
//expect(heartBeatNotification.getMonitoredPageName()).toBe(400);
//browser.controlFlow().execute(heartBeatNotification.getMonitoredPageName);
})
问题是测试案例总是成功的,无论URL给出了什么。需要编写测试案例以检查应用程序是否正在运行。
任何非零状态代码都会为"真实",因此您需要调整测试案例。让它检查响应是否显式为200,或者甚至只是检查它的2xx,因为它仍然成功。
expect(heartBeatNotification.getMonitoredPageName()).toEqual(200);
或仅检查其大于200或小于300等。
expect(heartBeatNotification.getMonitoredPageName()).toBeGreaterThanOrEqual(200);
expect(heartBeatNotification.getMonitoredPageName()).toBeLessThan(300);
另外,次要注意,您可能需要在第一个if
块上查看逻辑。
if (error || response.statusCode ==400) {
defer.reject(response.statusCode);
}
如果存在错误,则可能没有response.statusCode
(不是阳性)。最好只拒绝错误本身
我能够以这种方式进行测试。您试图做的事情有点简化,但应该可以帮助您弄清楚它。要注意的一件事,如果块设置有问题,则您的使用方式。如果response
是undefined
,则测试将超时,承诺将永远不会返回。无论如何,这就是我能够使您的测试工作的方式。
it('should return status code 200', async () => {
const url = 'http://google.com';
await heartBeatNotification.getMonitoredPageName(url).then(statusCode => {
expect(statusCode).toEqual(200);
}, () => {
fail('app not started');
});
});
这是功能:
getMonitoredPageName = (url) => {
const defer = protractor.promise.defer();
request(url, (err, response, body) => {
if(err) {
defer.reject();
} else {
defer.fulfill(response.statusCode);
}
});
return defer.promise;
}