在量角器中使用 angular 个函数 ($q)
Using angular functions ($q) in protractor
我想在我的 e2e 测试中使用 angular 的 $q 服务。 (我想通过 getText() 获取一堆元素的文本,其中 return 是一个承诺。在解决所有承诺之后,我想测试列表。所以我想使用 $q.all() 等)
angular.injector(['myApp']).get('$q');
结果为 "ReferenceError: angular is not defined"
通过节点安装 angular 然后 var angular = require("angularjs");
结果 "Error: Cannot find module 'angular'"
此外,插入 browser.waitForAngular()
也无济于事。
使用inject(function($q) {})
语法也有同样的问题。
如何在量角器中使用这样的 angular 函数?
编辑:
这是我想要实现的非常天真的版本
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;
};
这在原则上是有效的,在某个时间点 entries 包含所有数据。但是,我需要等待那一刻。我要做的是创建并 return 一个承诺,一旦所有 getText 承诺得到解决,该承诺就会得到解决。
例如
var deferred = $q.defer();
$q.all(getTextPromises).then(function () {
deferred.resolve(entries);
});
return deferred.promise;
从你的代码来看 containers
是一个 elementFinder 列表? (即 var containers = [element(by.x), element(by.y), element(by.z)]
):
Using 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'})
我想在我的 e2e 测试中使用 angular 的 $q 服务。 (我想通过 getText() 获取一堆元素的文本,其中 return 是一个承诺。在解决所有承诺之后,我想测试列表。所以我想使用 $q.all() 等)
angular.injector(['myApp']).get('$q');
结果为 "ReferenceError: angular is not defined"
通过节点安装 angular 然后 var angular = require("angularjs");
结果 "Error: Cannot find module 'angular'"
此外,插入 browser.waitForAngular()
也无济于事。
使用inject(function($q) {})
语法也有同样的问题。
如何在量角器中使用这样的 angular 函数?
编辑:
这是我想要实现的非常天真的版本
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;
};
这在原则上是有效的,在某个时间点 entries 包含所有数据。但是,我需要等待那一刻。我要做的是创建并 return 一个承诺,一旦所有 getText 承诺得到解决,该承诺就会得到解决。
例如
var deferred = $q.defer();
$q.all(getTextPromises).then(function () {
deferred.resolve(entries);
});
return deferred.promise;
从你的代码来看 containers
是一个 elementFinder 列表? (即 var containers = [element(by.x), element(by.y), element(by.z)]
):
Using 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'})