在量角器中使用角度函数($ q)

时间:2015-01-14 10:33:53

标签: angularjs testing protractor end-to-end

我想在我的e2e测试中使用角度的$ q服务。 (我希望通过 getText()获取一堆元素的文本,这些元素会返回一个promise。在所有的promise都被解析后,我想测试列表。所以我想使用 $ q.all()等。)

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

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

此外,插入browser.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 承诺得到解决后立即解决的承诺。

e.g。

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

1 个答案:

答案 0 :(得分: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'})

但是量角器本身就知道了承诺(并且最好不要将量角器的承诺与q承诺混合起来,除非你知道你在做什么):

    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'})