我想在我的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;
答案 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'})