Я создал службу, которая обрабатывает соединение websocket с сервером, и я пытаюсь создать для него модульные тесты, но я не могу найти способ подделать rxjs / Websocket .
Я нашел аналогичный вопрос здесь , но я не могу использовать его с новой версией rx js. Любая помощь будет очень полезна.
Я также мог бы внедрить WebSocket как службу и смоделировать службу в моем тесте, но это похоже на обходной путь, и я предпочитаю лучшее решение
Вот код mi:
socket.service.ts
//imports
@Injectable()
export class SocketService {
private baseUrl = ENV.WS_WORKSPACES_URL;
socket$: WebSocketSubject<any>;
constructor(
private userService: UserService
) { }
initSocket(): void {
this.socket$ = webSocket(`${this.baseUrl}clusters`);
const user = this.userService.getUser();
if (user) {
this.send({token: user.token});
}
}
send(data: any): void {
this.socket$.next(data);
}
}
socket.service.spec.ts
//imports
describe("SocketService", () => {
let service: SocketService;
let userServiceSpy;
let socket;
const token = "whatever";
beforeEach(() => {
userServiceSpy = jasmine.createSpyObj("UserService", ["getUser"]);
userServiceSpy.getUser.and.returnValue(null);
socket = {next: jasmine.createSpy()};
TestBed.configureTestingModule({
providers: [
{provide: UserService, useValue: userServiceSpy},
SocketService
]
});
service = TestBed.inject(SocketService);
socket = {} //this should be my mock
});
it("should be created", () => {
expect(service).toBeTruthy();
});
it("should open connection", () => {
service.initSocket();
expect(socket.next).not.toHaveBeenCalled();
expect(service.socket$).toBeDefined();
});
it("should open connection with auth", () => {
const user = {token};
userServiceSpy.getUser.and.returnValue(user);
service.initSocket();
expect(socket.next).toHaveBeenCalledWith(user);
});
it("should send a message", () => {
service.initSocket();
const message = {};
service.send(message);
expect(socket.next).toHaveBeenCalledWith(message);
});
});