【问题标题】:How to Mock and test using an RxJS subject?如何使用 RxJS 主题进行模拟和测试?
【发布时间】:2016-12-26 01:36:34
【问题描述】:

我有一些函数可以接受我想要测试的 RxJS 主题(支持套接字)。我想以一种非常请求回复的方式来模拟这个主题。由于我不确定一个干净的 Rx 方法来做到这一点,我很想使用 EventEmitter 来形成我的假套接字。

一般来说,我想:

  • 检查在我的“套接字”上收到的消息是否符合预期
  • 回复同一主题的消息:observer.next(resp)

我确实需要能够使用消息中的数据来形成响应。


被测试的代码是

export function acquireKernelInfo(sock) {
  // set up our JSON payload
  const message = createMessage('kernel_info_request');

  const obs = shell
    .childOf(message)
    .ofMessageType('kernel_info_reply')
    .first()
    .pluck('content', 'language_info')
    .map(setLanguageInfo)
    .publishReplay(1)
    .refCount();

  sock.next(message);
  return obs;
}

【问题讨论】:

    标签: rxjs5


    【解决方案1】:

    您可以手动创建两个主题并将它们“粘合在一起”作为一个主题 Subject.create

    const sent = new Rx.Subject();
    const received = new Rx.Subject();
    
    const mockWebSocketSubject = Subject.create(sent, received)
    
    const s1 = sent.subscribe(
      (msg) => sentMsgs.push({ next: msg }),
      (err) => sentMsgs.push({ error: err }),
      () => sendMsgs.push({ complete: true })
    );
    
    const s2 = recieved.subscribe(
      (msg) => sentMsgs.push({ next: msg }),
      (err) => sentMsgs.push({ error: err }),
      () => sendMsgs.push({ complete: true })
    );
    
    
    // to send a message
    // (presumably whatever system you're injecting this into is doing the sending)
    sent.next('weee');
    
    // to mock a received message
    received.next('blarg');
    
    s1.unsubscribe();
    s2.unsubscribe();
    

    也就是说,这实际上取决于您要测试什么、它的结构以及 API 是什么。

    理想情况下,您应该能够同步运行整个测试。如果由于某些与 Rx 相关的原因不能,您应该查看TestScheduler,它具有在虚拟化时间内运行测试的设施。

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2019-09-01
      • 2018-03-24
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多