javascript - 如何对 rxjs5 进行单元测试?

标签 javascript unit-testing testing rxjs reactive-programming

我已经通读了这个“marble-string”文档,但我还是不明白。

我要测试的基本上是一个“协议(protocol)”。我有一个连接到 Observable 并发出数据的“东西”。在我使用 Rx.NET 和 C# 的后端代码中,我编写了一个帮助程序来测试协议(protocol),以便我的测试看起来像这样:

verifier.Send(new AddMaterialPickCommand(commandId, orderId, materialId: Guid.NewGuid(), quantity: 1))
            .FailWhen<CommandFailedEvent>(e => e.CommandId == commandId)
            .ThenExpect<MaterialPickAddedEvent>(e => e.EntityId == orderId)
            .ThenSend(new DeleteOrderCommand(commandId, orderId))
            .FailWhen<CommandFailedEvent>(e => e.CommandId == commandId)
            .ThenExpect<OrderDeletedEvent>(e => e.EntityId == orderId)
            .ExecuteAndWait(Timeout);

在 C# 中,将 observables 连接到所有事物非常容易,等待也非常容易。 IMO 这是一个非常可读的测试代码。

对于 Rxjs5,我没有发现任何等待或做类似事情的可能性。所以 atm 我无法检查我的 observable 发出的一件事是否符合预期:

sut.setValue("key1", "key2");
sut.getObservable("key1", "key2")
    .subscribe(value => {
       expect(value).toBe("testValue")  // I want either execute this or fail after a timeout
    });

setValue 实际上在 BehaviourSubject 上调用 next()

我一无所知,有什么想法吗?

最佳答案

有很多方法可以做到这一点,一种方法是超时,如本例 (working example) 所示:

// Generates a value every second starting one second after subscription
const eventEmulatorStream = Rx.Observable.interval(1000);

// Listen to the event stream and timeout after 500 ms.
// On timeout an error will be generated that will be caught in the 
// 'error' part of the subscribe.
eventEmulatorStream
    .timeout(500)
    .subscribe({
        next: value => console.log(value),
        error: err => console.log(JSON.stringify(err))
    });

我建议你看一下 RxJS reference ,里面有很多好吃的东西。根据您使用 RxJS 的方式和位置,您可能需要导入/加载一些东西才能访问某些功能,但应该在 RxJS 文档中非常清楚地解释这些内容。

关于javascript - 如何对 rxjs5 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863162/

相关文章:

java - 使用 Mockito 注入(inject) Autowiring 的 bean 并在模拟上设置一些属性

ruby-on-rails - 为什么 Test::Unit 测试用例启动如此缓慢?

javascript - 阻止 YouTube javascript API 中的后续自动播放

Javascript:条件函数onClick按钮

javascript - 如何在 Web 组件中展平/消除属性更改回调

asp.net-mvc - 在 ASP.NET MVC 测试项目中模拟静态方法

testing - 使用不同输入文件的数据驱动自动化测试

java - 有没有人使用 SIKULI 来测试他们基于 GUI 的应用程序?

testing - FIFO信号量测试

javascript - 使用 ajax 在同一页面中显示特定类别的产品 - ajax、laravel