这是我的聊天服务:
import {webSocket, WebSocketSubject} from 'rxjs/webSocket';
import {delayWhen, retryWhen, take} from 'rxjs/operators';
import {timer} from 'rxjs';
...
export class ChatConnectionService {
private readonly _connection: WebSocketSubject<any>;
public readonly messages$: Observable<ChatInboundMessage>;
constructor() {
this._connection = this.getConnection();
this.messages$ = this._connection.asObservable();
}
private getConnection(): WebSocketSubject<any> {
return webSocket(`.../chat`);
}
}
这是我目前为止所做的尝试:
import * as rxJsWebSocket from 'rxjs/webSocket';
describe('ChatConnectionService', () => {
let service: ChatConnectionService;
const subject = new Subject();
let webSocketSpy;
beforeEach(() => {
webSocketSpy = spyOnProperty(rxJsWebSocket, 'webSocket', 'get').and.returnValue(<any>subject);
service = new ChatConnectionService();
});
it('should create a new connection when service instantiated', () => {
expect(webSocketSpy).toHaveBeenCalledTimes(1);
});
});
但是它给了我以下错误:
Error: <spyOnProperty> : webSocket is not declared configurable
如何将webSocket
替换为主题,以便我可以测试它?RxJs: 6.5.5
似乎没有很好的解决方案,这里有一个关于fromEvent
算子的类似主题:错误:& lt; spyOn>: fromEvent未声明为可写或没有setter。
如果意图是直接监视操作人员,那么唯一有效的选择似乎是针对ES5
,我不认为这是一个解决方案,因为部署ES6+
可以减少包的大小。
我想最好的选择可能是为webSocket
操作符提供包装函数。包装器函数已经可以被监视。在您的示例中,最简单的方法是为getConnection()
函数设置一个间谍,该函数负责返回连接实例。