开玩笑嘲笑 rxjs 的lastValueFrom

fel*_*mmm 4 rxjs typescript nestjs

我有一个使用 rxjs 的 lastValueFrom 方法的控制器,我想模拟该方法,以便不会调用实际的方法。我的控制器代码是:

async doSomething(request) {
  ...
  const data = await lastValueFrom(
    ...
  );
  ...
}
Run Code Online (Sandbox Code Playgroud)

为了测试,我尝试了多种方法,即:

import rxjs from 'rxjs';

jest.spyOn(rxjs, 'lastValueFrom').mockReturnValueOnce(
  new Promise((resolve, reject) => {
    resolve(true);
  }),
);
// This gives me error: Cannot spyOn on a primitive value; undefined given
Run Code Online (Sandbox Code Playgroud)
import { lastValueFrom } from 'rxjs';

lastValueFrom = jest.fn().mockReturnValueOnce(
  new Promise((resolve, reject) => {
    resolve(true),
);
// This gives me error: Cannot assign to 'lastValueFrom' because it is an import.
Run Code Online (Sandbox Code Playgroud)
import rxjs from 'rxjs';

rxjs.lastValueFrom = jest.fn().mockReturnValue(
  new Promise((resolve, reject) => {
    resolve(true);
  }),
);
// This gives me error: Cannot set property 'lastValueFrom' of undefined
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 6

如果您使用 TypeScript 恐怕唯一的方法是模拟 import 'rxjs'

jest.mock('rxjs', () => {
  const original = jest.requireActual('rxjs');

  return {
    ...original,
    lastValueFrom: () =>
      new Promise((resolve, reject) => {
        resolve(true);
      }),
  };
});

import { of, lastValueFrom } from 'rxjs';

test('test', () => {
  lastValueFrom(of(1)).then((val) => {
    expect(val).toStrictEqual(true);
  });
});
Run Code Online (Sandbox Code Playgroud)

现场演示:https://stackblitz.com/edit/node-6vjbxb?file =index.spec.ts

仅使用 ES* 似乎您就可以做到:How to spy on a default Export function with Jest?