如何使用 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() 的方式是正确的。也许您也可能无法通过任何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,
  );
);

【讨论】:

但我不确定在哪里添加断言,nexterror 中的 expect(如果添加)从未调用过。 如果你想确保它永远不会被称为 make 例如。 next 处理程序与broken = true 然后在complete 你可以expect(broken).toBe(false)

以上是关于如何使用 Jest 测试 Rxjs 空操作符的主要内容,如果未能解决你的问题,请参考以下文章

Jest 报告测试通过,即使期望断言失败

如何测试 Firebase 登录操作(React/Jest)

如何在 Jest 的自定义测试环境文件中使用 TypeScript?

如何使用 Jest 测试 Reflux 动作

如何使用 Jest 和 Sinon 测试 Thunk 动作

如何测试 vuex 操作,其中 jest 里面有一个 api 调用?