我正在尝试在个人的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(),
});
});
如果要轻松完成测试,可以使用内置的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('|');
})
})
})
|
符号表示完成。
结果:
问题是您正在done()
处理程序中调用complete
。调用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,
});
});