量角器承诺fn不是函数

时间:2017-02-17 15:30:53

标签: javascript selenium-webdriver promise protractor

编辑:我想我明白为什么它不起作用。调用flow.execute(getSpendermeldung)时,我无法传递Arguments。有人比在另一个函数中使用“全局”变量包装ApiCall更好吗?我打算在另一个文件中使用它,并在必要时使用require。

原帖: 对于我的量角器测试,我想从数据库中获取测试数据。我使用nodejs http模块做到了这一点,到目前为止它正在运行。由于我使用这些数据测试,我已经在同步问题中运行。我用jasmines回调解决方案绕过他们。然而,我发现这是不灵活的,并希望使用承诺和控制流程。可悲的是,当我执行我的代码时,我得到一个错误:fn不是一个函数。在webdriver / lib / promise.js深处的某个地方

这是我的功能:

function getSpendermeldung(kennnummer) {
var http = require('http');

var defer = protractor.promise.defer();

var options = {
    host: 'localhost',
    path: '/blabla/' + kennnummer
};

var callback = function (response) {
    var body = '';
    response.on('data',
        function (chunk) {
            body += chunk;
        });
    response.on('end',
        function () {
            spendermeldung = JSON.parse(body);
            defer.fulfill('json parsed');
        });
};

http.get(options, callback).end();

return defer.promise;
}

我称之为:

 var flow = browser.controlFlow();
 flow.execute(getSpendermeldung('D0000001'));

有人知道我错过了什么。感谢。

PS:很想发布堆栈跟踪,但我没有正确的格式化。

2 个答案:

答案 0 :(得分:0)

您需要返回延迟对象defer defer.promise

其次,一个小小的修正,你在结束请求之前履行承诺。难道你不应该这样做吗?

http.get(options, callback).end(function nowFulfillPromise() {
   defer.fulfill('json parsed');
});

答案 1 :(得分:0)

您正在调用函数 - getSpendermeldung而不是将其作为参数传递。是的,我认为你可以在不使用全局变量和使用另一个文件的需求的情况下实现它

有关flow.executehere

的论据的更多详细信息
var apiCall = require('the-file-that-containsthe-function')
var flow = browser.controlFlow();
flow.execute(function(){return getSpendermeldung('D0000001')});