4

我想在我的 e2e 测试中使用 angular 的 $q 服务。(我想通过getText()获取一堆元素的文本,它返回一个承诺。在所有承诺都解决后,我想测试列表。所以我想使用$q.all()等)

angular.injector(['myApp']).get('$q');导致“ReferenceError:未定义角度”

通过节点安装角度,然后var angular = require("angularjs");导致“错误:找不到模块'角度'”

此外,插入 abrowser.waitForAngular()也无济于事。

使用inject(function($q) {})语法有同样的问题。

如何在量角器中使用这样的角度函数?


编辑:

这是我想要实现的非常天真的版本

var collectEntries = function(containers) {
    var entries = {};
    containers.each(function (container) {
        var title = container.element(by.tagName('h2'));
        title.getText().then(function (text) {
            var key = getSomeKey();
            var entry = processEntry(text);
            entries[key] = entry;
        });
    });
    return entries;
};

这原则上有效,在某个时间点条目包含所有数据。然而,我需要等待那一刻。我要做的是创建并返回一个承诺,一旦所有getText承诺得到解决,该承诺就会得到解决。

例如

var deferred = $q.defer();
$q.all(getTextPromises).then(function () {
    deferred.resolve(entries);
});
return deferred.promise;
4

1 回答 1

4

从您的代码看起来containers是 elementFinders 的列表?(即var containers = [element(by.x), element(by.y), element(by.z)]):

使用 q: (你需要先在 package.json 中添加 q 作为依赖)

    var q = require('q');
    var collectEntries = function(containers) {
        var entries = {};
        containers.each(function (container) {
            var deferred = q.defer();
            var title = container.element(by.tagName('h2'));
            title.getText().then(function (text) {
                deferred.resolve(processEntry(text));
            });
            entries[getSomeKey()] = deferred.promise();
        });
        return q.all(entries);
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})

但是 protractor 知道 promise 本身(最好不要将 protractor 的 promise 与 q promise 混合,除非你知道自己在做什么):

    var collectEntries = function(containers) {
        var entries = {};
        containers.each(function (container) {
            entries[getSomeKey()] = container.element(by.tagName('h2')).
                getText().then(function (text) {
                    return processEntry(text);
                });
        });
        return protractor.promise.fullyResolved(entries);
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})

如果您containers使用单个选择器(即var containers = element.all(by.xyz))找到您,则更容易:

    var collectEntries = function(containers) {
        return containers.reduce(function(entries, elem) {
          return elem.getText().then(function(text) {
            entries[getSomeKey()] = processEntry(text);
            return entries;
          });
        }, {});
    };

    expect(collectEntries).toBe({key1: 'title1', key2: 'title2'})
于 2015-01-14T19:47:44.397 回答