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