Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.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 如何在角度单元测试中建立websocket连接?_Angular_Unit Testing_Websocket - Fatal编程技术网

Angular 如何在角度单元测试中建立websocket连接?

Angular 如何在角度单元测试中建立websocket连接?,angular,unit-testing,websocket,Angular,Unit Testing,Websocket,我正在开发一个Angular(v6.1.0)应用程序,它通过websocket与后端进行通信。到目前为止,除了单元测试之外,一切都很好。为了测试我的组件,我创建了一个模拟后端,但是我无法在模拟后端和测试模块之间建立连接。我将Jasmine用作断言库,将Jest用作测试运行程序,这是一个示例测试套件: description('RandomComponent',()=>{ let组件:随机组件; let夹具:组件夹具; beforeach(异步(()=>{ TestBed.configureTes

我正在开发一个Angular(v6.1.0)应用程序,它通过websocket与后端进行通信。到目前为止,除了单元测试之外,一切都很好。为了测试我的组件,我创建了一个模拟后端,但是我无法在模拟后端和测试模块之间建立连接。我将Jasmine用作断言库,将Jest用作测试运行程序,这是一个示例测试套件:

description('RandomComponent',()=>{
let组件:随机组件;
let夹具:组件夹具;
beforeach(异步(()=>{
TestBed.configureTestingModule({
声明:[],
导入:[SomeModule],
提供者:[特殊WebSocketService,WebSocketService,
{提供:BackendUrlService,useClass:BackendUrlMockService}
]
})
.compileComponents();
}));
在每个之前(()=>{
fixture=TestBed.createComponent(随机组件);
组件=fixture.componentInstance;
fixture.detectChanges();
});
它('应该创建随机组件',()=>{
expect(component.toBeTruthy();
});
});
BackendUrlMockService只是提供一个URL。单个测试用例产生以下结果:

src/app/path/to/my/random.component.spec.ts失败
随机成分
✕ 应创建随机组件(603ms)
● 随机组件›应创建随机组件
InvalidStateError:仍处于连接状态。
应用程序在真实后端和模拟后端都可以正常工作。测试模块两者都不能工作。我还注意到,如果我向测试用例添加超时:

it('应该创建随机组件',(完成)=>{
设置超时(()=>{
expect(component.toBeTruthy();
完成();
}, 1000);
});

我的模拟后端记录了一条消息,表明连接已正确建立,但我仍然收到错误。有人知道如何正确设置一切以便我可以测试我的组件吗?

基于@user184994的评论,我决定模拟websocket而不是后端:

const mockData={
//一些任意数据
};
类WebSocketServiceSpy{
private messageSpy=新主题();
private messageHandler=this.messageSpy.asObservable();
CreateObservableScocket(url:string):可观察{
log(`Websocket将连接到${url}.`);
返回新的可观察对象(观察者=>{
this.messageHandler.subscribe(()=>{
next(JSON.stringify(mockData));
});
});
}
sendMessage(消息:任意){
this.messageSpy.next();
}
}
然后,我在测试模块中使用了它:

beforeach(异步(()=>{
TestBed.configureTestingModule({
声明:[],
导入:[SomeModule],
提供者:[SpecialWebSocketService,BackendUrlService,
{提供:WebSocketService,useClass:WebSocketServiceSpy}
]
})
.compileComponents();
}));
测试最终为绿色:

传递src/app/path/to/my/random.component.spec.ts
● 安慰
console.log src/app/path/to/my/random.component.spec.ts:911
Websocket将连接到。

为了进行单元测试,您应该真正模拟websocket,这样您就可以测试代码,而不是代码depedencies@user184994你能详细说明一下吗?那些websocket服务是我自己的,只是简单的包装。你的意思是他们应该返回消息而不是连接任何东西?是的,没错。当你测试一个组件时,你应该去掉它的所有依赖项(即使它是你自己的代码)。好的,我会试试看,并在回复中公布结果。