我们最近使用Angular 6 UI开始使用赛普拉斯进行E2E测试。它被证明是伟大的,在我们看来,比Protractor好得多。
我们的计划是模拟与服务器的所有交互。这对于使用cy.route()和fixture的所有REST / XHR调用都很容易。
但是,我们也使用Web套接字。并且嘲笑与之相互作用证明并非如此简单。
根据我迄今为止所做的研究,我能找到的唯一建议是建议使用cy.stub()。这听起来很好,但我找不到任何详细说明,理想情况下使用它来模拟Web套接字的一些例子。
我认为可能有用的另一种方法是使用Angular TestBed服务。注入您自己的服务,处理我们与Web套接字的交互。
但要么是正确的路线下降?任何人都可以提供应该做的最佳方式的任何例子吗?
任何指示让我朝着正确的方向前进,让我开始将受到大力赞赏。谢谢。
经过多次讨论,我终于想出了自己的解决方案。基本上这来自使用ng.probe()。
特别是对于赛普拉斯,通过cy.window()函数获取对ng的访问,例如:
cy.window().then((win: any) => {
const ngComponent = win.ng.probe(win.document.getElementsByTagName("component-name")[0].componentInstance;
const myService = ngComponent.myService;
myService.doSomething();
});
请注意,首先获取注入该服务的组件的句柄,即可获得服务。在我的情况下,我所关注的服务被注入app-root组件,所以我得到了一个句柄,然后我想要调用或模拟我的测试的websocket服务。
我在工作中遇到了类似的问题,最终得到了类似的解决方案(我认为)。
我们的应用程序依赖于另一个库来做一些网络工作。我没有使用TestBed或类似的,而是使用Angular的环境文件来为e2e测试提供不同的服务,该测试遵循与真实服务相同的界面。
然后在存根服务(返回fixture数据)中,我在窗口对象上公开了方法,以便在运行时与存根进行交互,使其返回不同的数据等。
我发了一篇博客文章解释了这个方法,以及提交。
http://wtfisanapi.com/htf-do-i-write-e2e-tests-with-a-stubbed-dependency-angular-nrwl-nx-edition/
完整的代码可以在这里找到https://github.com/robt1019/e2e-stub-demo
您的解决方案是如何为您服务的?