Я создаю клиент, который обернет библиотеку SignalR
:
export class RealTimeCommunicator {
/** SignalR hub connection */
private hubConnection: HubConnection | null = null;
private buildConnection(url: string): HubConnection {
return new HubConnectionBuilder()
.withUrl(url)
.build();
}
public subscribe(onStart: () => void, success: (data: IVehicleInfo) => void, fail?: (err: Error) => void): () => void {
this.hubConnection = this.buildConnection("/someurl");
this.hubConnection.on("send", data => {
success(data);
});
this.hubConnection.start()
.then(onStart)
.catch(err => fail && fail(err));
return this.unsubscribe;
}
public subscribeToVehicleDetails(vehicleId: number, success: (data: IVehicleInfo) => void, fail?: (err: Error) => void): () => void {
return this.subscribe(() => this.hubConnection!.invoke("EnrolInVehicleGroupAsync", vehicleId), success, fail);
}
Я хочу протестировать ее, но макет SignalR
, поэтому я добавил __mocks__/@aspnet/signalr.ts
к решению:
let SignalR = jest.genMockFromModule("@aspnet/signalr");
class HubConnection {
public on(methodName: string, callback: () => string): Promise<void> {
this.successCallback = callback;
return Promise.resolve()
}
public start(): Promise<void> { return Promise.resolve() }
public successCallback: () => string = () => "failure";
}
let hubConnection = new HubConnection();
let HubConnectionBuilder = () => ({
withUrl: (url) => ({
build: () => hubConnection
})
});
SignalR = {
HubConnectionBuilder: HubConnectionBuilder,
HubConnection: hubConnection
};
module.exports = SignalR;
Я пытаюсь шпионить за методом on
, чтобы убедиться, что он был вызван, и в качестве дополнительной цели подтвердите, что мой обработчик успеха был зарегистрирован правильно.
import { RealTimeCommunicator } from "./RealTimeCommunicator";
jest.mock('SignalR');
describe("RTC", () => {
test("foo", () => {
const ConnectionBuilder = require("SignalR").HubConnectionBuilder;
const connection = new ConnectionBuilder().withUrl("").build();
const spy = jest.spyOn(connection, 'on');
expect(spy).toHaveBeenCalled(); //Expectation fails
const successText = "success!";
const successCallBack: () => string = () => successText;
const rtc = new RealTimeCommunicator();
rtc.subscribeToVehicleDetails(1, successCallBack, _ => _);
expect(connection.successCallback()).toBe(successText); // connection.successCallback is undefined
})
});
Если яПоместите контрольные точки в мой SignalR
макет, я вижу, что вызывается on
, но шпион не видит его.Также successCallback
, который я прикрутил к моей шутке, возвращается как undefined