Testing 测试

返回 Observable 的函数

以上一篇 Pagination 为例:

describe('CatsService', () => {
  it('pagination', complete => {
    pagination({
      // 在这里定义请求参数
      limit: 10,
      offset: 0
    })
      // 直接订阅
      .subscribe({
        next(cats) {
          // 在 next 里进行期望检测
          expect(cats.items).toContainEqual(
            expect.objectContaining({
              name: 'kitty',
              age: 1,
              breed: 'sth'
            })
          );
        },
        // 直接传递 complete 方法(也就是一般命名为 next 或者 done 的方法)
        complete
      });
  });
});

直接调用 Observable 的函数

不推荐这样的方式定义和使用 Observable 对象。

示例的函数代码:

export default function DemoTask(): void {
  //  多线程任务执行器
  const task = from(Promise.resolve('DemoTask')).pipe(
    // 打印参数
    tap(x => console.log(x, 'Task Info'))
    // 处理任务
    // 忽略业务代码
  );

  task.subscribe({
    complete() {
      console.log('Task Done');
    },
    error(err) {
      console.error('Task Failed', err);
    }
  });
  // 没有 return
}

该函数返回类型为 void,直接在其内部进行了 Observable 的订阅和处理。

测试用例写法:

import { from, timer } from 'rxjs';
import { mergeMap, tap } from 'rxjs/operators';
// other imports

describe('Task Demo', () => {
  it('create task', complete => {
    // 同步方式执行
    DemoTask();
    // 设置一个延迟执行
    const test = timer(300).pipe(
      // 进行期望检测
      mergeMap(() => Promise.resolve(1)),
      tap(val => expect(val).toEqual(1))
      // 多个期望的话可以使用 forkJoin 等方式灵活组排
    );
    test.subscribe({ complete });
  });
});
在 GitHub 上编辑此页面 article.updatedAt Wed, Aug 11, 2021