Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何等待RxJS Websocket在量角器中得到响应?_Angular_Protractor_Rxjs - Fatal编程技术网

Angular 如何等待RxJS Websocket在量角器中得到响应?

Angular 如何等待RxJS Websocket在量角器中得到响应?,angular,protractor,rxjs,Angular,Protractor,Rxjs,我有一个简单的登录页面对象,它填写登录信息并单击按钮。单击该按钮时,服务将使用ObservableObservable.websocket(url)调用websocket。然后,一旦websocket响应被发回,我们就可以通过导航到另一条路径前进。测试问题是,在运行click()之后,我们仍然需要几毫秒才能得到身份验证响应。这意味着下一行在websocket返回并且路由器被重定向之前运行(这里有点猜测)。我尝试过类似于elem.click().然后(function(){…})和browser.

我有一个简单的登录页面对象,它填写登录信息并单击按钮。单击该按钮时,服务将使用Observable
Observable.websocket(url)
调用websocket。然后,一旦websocket响应被发回,我们就可以通过导航到另一条路径前进。测试问题是,在运行
click()
之后,我们仍然需要几毫秒才能得到身份验证响应。这意味着下一行在websocket返回并且路由器被重定向之前运行(这里有点猜测)。我尝试过类似于
elem.click().然后(function(){…})
browser.wait
的方法,但唯一有效的方法是
setTimeout


是否有一种方法可以使用量角器测试这些UI副作用类websocket消息?

作为单位置解决方案:您可以为
浏览器编写自己的谓词函数。等待
,它将在浏览器端执行JS,并在套接字关闭时返回true(或您自己的检查):

作为测试项目的长期全球解决方案。我建议研究量角器插件的特性。您可以定义自己的
waitForPromise
hook,它将在每个操作之间执行

和类似的:

exports.waitForCondition

你说一旦你收到回复,你就导航到另一条路线。你能用这个吗?将
browser.wait()
getCurrentUrl()
组合,并在url包含新路由时返回。我可以尝试一下,看看,我也在考虑模拟我的websocket服务,但我认为我正在远离真正的E2E测试。实际上,如果我做了类似
browser.wait(function()的事情,那么效果相当不错{return browser.getCurrentUrl().then(函数(x){x===“…”})
但我不确定我是否喜欢这样。当我收到一条没有更改url或其他内容的消息时会发生什么情况。在这种情况下,我可能只会等待新的内容附加到DOM中。如果出于某种原因,很难捕获到它(即,您的新页面在HTML方面与旧页面非常相似),您可以等待旧页面消失(使用预期条件,
stalenessOf(…)
),然后等待新页面出现(预期条件,
presenceOf(…)
)不过,我想您可能已经了解了一些情况,因为我使用的量角器可能意味着我在Angular 2中工作。因此,我不确定我将在伪代码中添加什么来访问ness.services。此外,我们正在保持websocket对推送通知的开放。如果我能够以某种方式掌握WS-ser,我想您所描述的可能会是什么样子我用的是副作用,抓住了可观察的物体。我真的不知道该怎么做。
/**
 * Between every webdriver action, Protractor calls browser.waitForAngular() to
 * make sure that Angular has no outstanding $http or $timeout calls.
 * You can use waitForPromise() to have Protractor additionally wait for your
 * custom promise to be resolved inside of browser.waitForAngular().
 *
 * @this {Object} bound to module.exports
 *
 * @throws {*} If this function throws an error, a failed assertion is added to
 *     the test results.
 *
 * @return {q.Promise=} Can return a promise, in which case protractor will wait
 *     for the promise to resolve before continuing.  If the promise is
 *     rejected, a failed assertion is added to the test results, and protractor
 *     will continue onto the next command.  If nothing is returned or something
 *     other than a promise is returned, protractor will continue onto the next
 *     command.
 */
exports.waitForPromise = function() {};
exports.waitForCondition