依赖文件中readOnly函数的Jest模拟

2q5ifsrm  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(172)

mainClass.js

import { GetData } from './childClass';

export class MainClass {
  static async execute() {
    const response = GetData();
    return response;
  }
}

childClass.js

class response {
  constructor({ data }) {
    this.data = data;
  }
}

export async function GetData() {
  return new response(data);
}

在这里,我尝试使用jest测试这个mainClass.jsexecute函数。为了测试,我想模拟GetData函数,它是childClass文件的一部分。但是这里有一点我不能直接模拟这个函数,因为GetData是只读的。我不能将函数属性更改为读写。所以我想要一种方法来模拟这个GetData函数。
尝试过的东西

1)
beforeAll(() => {
  jest.mock('./childClass', () => ({
    GetData: jest.fn()
 }));
});

2)
beforeAll(() => {
  mockFunctionData = jest.spyOn(MainClass, 'GetData').mockReturnValue({});
});

没有一个在工作。先谢谢你了。

monwx1rj

monwx1rj1#

首先,我个人更喜欢spyOn,所以我会用它来回答。
当您执行jest.spyOn(MainClass, 'GetData')时,您的目标是错误的。您希望在childClass.js中模拟GetData函数。
因此,您需要监视包含它的对象:而不是MainClass
在你的例子中,对象是一个模块(即所以你必须将模块作为一个整体导入,然后监视它:

import * as childClassModule from './childClass'

// Note: `beforeAll()` won't work in some cases, depending on your Jest configuration.
// So it's better to use `beforeEach()` in this case.
beforeEach(() => {
  // Since your `GetData` function is async, you have to use `mockResolvedValue()`.
  jest.spyOn(childClassModule, 'GetData').mockResolvedValue({data: 'hello world'})
})

test('example', async () => {
  const result = await MainClass.execute()
  expect(result).toStrictEqual({data: 'hello world'})
})

相关问题