我如何用Jest测试观察值?
我有一个每秒触发~的可观测事件,我想在jest超时之前测试第一个事件是否被正确触发。
const myObservable = timer(0, 1000); // Example here
it('should fire', () => {
const event = myObservable.subscribe(data => {
expect(data).toBe(0);
});
});
这个测试通过了,但是如果我用toBe('anything')
替换,它也通过了,所以我猜我做错了什么。
我尝试使用expect.assertions(1)
,但它似乎只与承诺工作。
6条答案
按热度按时间zpf6vheq1#
在Jest文档中有一些关于为测试传递参数的很好的例子,这个参数可以被调用来表示测试通过,或者你可以在它上面调用fail来使测试失败,或者它可以超时并失败。
https://jestjs.io/docs/en/asynchronous.html
https://alligator.io/testing/asynchronous-testing-jest/
示例
请注意,我将超时设置为1500毫秒
使用 setTimeout查看是否失败的另一种方法
oknwwptz2#
我更喜欢的测试可观察性的方法,没有假计时器和超时,是
async
,await
和使用resolves
或rejects
对预期转换的承诺。在Rxjs 7及更高版本中,您可以使用
lastValueFrom
或firstValueFrom
进行promise转换7bsow1i63#
w51jfk4q4#
测试任何可观察到的RXJS的正确方法(Jest或no)是使用
rxjs/testing
中的TestScheduler
:例如:
从RXJS marble testing testing docs。
如果你有一个简单的可观察性,尝试将可观察性等转化为承诺效果很好。一旦事情变得更加复杂,如果不使用大理石图表和正确的测试库,你将会陷入困境。
v64noz0r5#
上面提到了两种方法
1.取测试中的参数,在测试完成后调用它.
1.使用firstValueFrom(myObs)或lastValueFrom(myObs)将我们的可观察性转换为承诺,并对它们使用async wait ...
如果我们有多个观察对象需要测试,那么我们必须在测试中嵌套这些观察对象,因为我们只能调用done()一次。在这种情况下,异步等待方法会很方便。在这个例子中,当我们调用filter Customer时,所有三个观察对象都发出值,所以我们必须测试所有的观察对象。
8dtrkrch6#
这是使用
fakeAsync
的Angular 方法假设我们有一个FooService,它有一个Observable
closed$
,每当我们调用服务的dismiss()
方法时,它都会发出。然后我们可以像这样测试
close$
发射