如何使用 Jest 测试 Rxjs 空操作符
Posted
技术标签:
【中文标题】如何使用 Jest 测试 Rxjs 空操作符【英文标题】:How test a Rxjs empty operater using Jest 【发布时间】:2020-09-24 05:35:54 【问题描述】:我试图在个人 NestJS 沙盒项目中编写一些测试。
@Injectable()
export class TodoService
private todos: Todo[] = [
id: 1, text: 'Learn Typescript', isCompleted: false ,
id: 2, text: 'Learn Nestjs', isCompleted: false ,
id: 3, text: 'Use Mongodb in Nestjs', isCompleted: false ,
];
findAll(): Observable<Todo>
return from(this.todos);
findById(id: number): Observable<Todo>
const foundTodos: Todo[] = this.todos.filter(d => d.id == id);
console.log("foundTodos:" + JSON.stringify(foundTodos));
if (foundTodos.length > 0)
return of(foundTodos[0]);
else
return empty();
//other methods
我尝试测试调用了empty()
,如何使用expect
在开玩笑的测试中存档?
it('findById with none-existing id should return empty', done =>
service.findById(100).subscribe(
next: data => console.log('data:', data),
error: err => console.log('error', err),
complete: done(),
);
);
更新:我还为自己找到了一个可行的解决方案。
-
将
toArray()
添加到pipe()
以将流转换为数组。
在订阅者的next
处理程序中断言data.length
等于0。
【问题讨论】:
【参考方案1】:如果您想轻松测试是否完成,可以使用内置的rxjs marble test:
describe('foo', () =>
let testScheduler: TestScheduler;
beforeEach(() =>
testScheduler = new TestScheduler((actual, expected) =>
expect(actual).toEqual(expected);
);
)
it('should test for completion', () =>
testScheduler.run(helpers =>
const expectObservable = helpers;
expectObservable(empty()).toBe('|');
)
)
)
|
标志标志着完成。
结果:
【讨论】:
【参考方案2】:问题是您在complete
处理程序中调用done()
。调用done()
将立即触发该方法。您可能只想使用done
,以便处理程序本身调用它。
否则您测试empty()
的方式是正确的。也许您也可能无法通过任何next
或error
通知的测试。
it('findById with none-existing id should return empty', done =>
service.findById(100).subscribe(
next: data => console.log('data:', data),
error: err => console.log('error', err),
complete: done,
);
);
【讨论】:
但我不确定在哪里添加断言,next
和 error
中的 expect
(如果添加)从未调用过。
如果你想确保它永远不会被称为 make 例如。 next
处理程序与broken = true
然后在complete
你可以expect(broken).toBe(false)
。以上是关于如何使用 Jest 测试 Rxjs 空操作符的主要内容,如果未能解决你的问题,请参考以下文章
如何测试 Firebase 登录操作(React/Jest)