【发布时间】:2014-07-05 12:50:15
【问题描述】:
我创建了一个小 api 来动态生成测试数据。每次调用都会创建一个新用户并返回创建的数据。
要加载数据我使用包request:
var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {
var defer = protractor.promise.defer();
request('http://localhost/test/recipe/person', function (error, response, body) {
if (!error && response.statusCode === 200) {
defer.fulfill(JSON.parse(body));
}
});
return defer.promise;
});
要使用检索到的数据,我必须解决承诺并在回调中继续执行测试脚本:
result.then(function(data) {
element(by.model('username')).sendKeys(data.person.email);
element(by.model('password')).sendKeys('test');
$('button[type="submit"]').click();
});
我不喜欢这种回调处理以及它可能导致的地狱。除此之外,Protractor 非常擅长隐藏这种混乱的回调处理。所以,问题是:
如何使用异步调用的结果?
最后我想执行如下代码:
var flow = protractor.promise.controlFlow();
var result = flow.execute(function() {...});
element(by.model('username')).sendKeys(result.person.email);
//...
有什么想法吗?
【问题讨论】:
-
Closing as duplicate - 简短的回答:你真的不能以一种好的方式,如果你这样做,它会减慢你的测试一大堆,他们会在性能方面表现不可靠。长答案在重复的问题中。如果您认为我找到的重复文件不能涵盖您的问题(我相信确实如此)- 请告诉我,我会重新打开它。
-
@BenjaminGruenbaum:我不认为这是完全重复的。不同的是进行 ajax 调用的环境。一方面,您有一个事件驱动的客户端,其中阻塞 IO 意味着阻塞的 UI。另一方面,您有一个测试执行框架,其关键功能是在一行中执行后续异步调用,就像它们在同步调用中一样。
-
随心所欲,我觉得核心问题一模一样这里也一样,不过我重新打开了
标签: javascript ajax http promise protractor