如何使用Jest测试Rxjs空操作符

问题描述 投票:1回答:2

我正在尝试在个人的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(),
    });
  });

typescript rxjs nestjs jest
2个回答
0
投票

如果要轻松完成测试,可以使用内置的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('|');
    })
  })
})

|符号表示完成。

结果:

enter image description here


0
投票

问题是您正在done()处理程序中调用complete。调用done()将立即触发该方法。您可能只想使用done,以便由处理程序本身调用。

否则,您测试empty()的方法是正确的。也许您也可能无法通过任何nexterror通知进行测试。

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,
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.