我们正在用phantomjs测试角度webapp.
控制器代码如下所示:
angular.module('module' ['dependency']).
controller('controller',function ($scope, Model) {
// blah-blah-blah
Model.list() // calls $http.get
.then(); // yadda-yadda-yadda
});
Run Code Online (Sandbox Code Playgroud)
后端是在java中,所以为了测试整个应用程序,我们使用的是Selenium Webdriver和PhantomJS.我使用这个片段来检查角度是否已经完成处理它的指令(从量角器源代码获得它).
var app = angular.element(document.querySelector('#ng-app'));
var $browser = app.injector().get('$browser');
$browser.notifyWhenNoOutstandingRequests(function () {
// callback
});
Run Code Online (Sandbox Code Playgroud)
它工作正常 - 在大多数情况下,它确实可以检测角度处理请求.
问题是有时我的回调似乎甚至在控制器执行之前就会触发.在我注意到这种行为的所有情况下,这都是路线变化.我已经尝试插入alert('');控制器的不同部分来找到它.
所以,问题是 - 我怎样才能在执行控制器功能后执行我的等待片段?
javascript automated-tests phantomjs angularjs selenium-webdriver
我正在尝试使用人力车和d3测试显示图形的应用程序.使用量角器和茉莉花实现测试.作为旁注,我认为这个问题并不是特定于这个用例,而且更为通用.
因此,测试应该将鼠标悬停在图形上并收集为每个点显示的文本(示例).然后将该数组与给定数组进行匹配.
我希望这个伪代码说明问题:
var graph = ... //
var promises = [];
var promise = graphElement.getSize().then(function(size){
_.times(size, function(i) {
moveMouse(i, 0); // move mouse to i-th pixel
promises.push(graph.element(by.css('.hover-text')).getText());
});
return promises;
});
promise.magicallyWaitForAllOfThem();
_.each(promises, function(textPromise){
expect(textPromise).toBe('something');
});
Run Code Online (Sandbox Code Playgroud)
所以,问题是因为我需要首先解析大小,我没有办法等待所有的promises解析并返回一个文本promise的数组,以后可以与expect()一起使用.
编辑:明确提到量角器/茉莉花.
我正在尝试创建一个框架,该框架允许我在接口字段上拥有元数据。像这样的东西:
function path(path) {}
interface ITwoProps {
@path('some/path') stringProp: string;
@path('different/path') boolProp: boolean;
}
class Impl1 implements ITwoProps {
get stringProp() {
return 'abc';
}
get boolProp() {
return !!'abc';
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这甚至无法编译。错误消息有点晦涩,但其想法是装饰器在接口上隐式禁用。它确实有意义,因为接口不会将其转化为转译代码,因此不会有转译代码可以附加装饰器。
我还尝试了另一种方法,我将使用类似模式的对象定义元和接口,并从中提取接口:
const Schema = {
boolProp: {
type: Boolean,
path: 'some/path'
},
stringProp: {
type: String,
path: 'different/path'
},
};
type PropertyDef<T> = {
type: (...args: any[]) => T,
path?: string;
};
type ExtractType<X> = X extends PropertyDef<infer T> ? T : never;
type ObjectInterface<T extends …Run Code Online (Sandbox Code Playgroud)