Jest.js 如何对链接函数调用进行单元测试?

mzmfm0qo  于 2022-12-08  发布在  Jest
关注(0)|答案(1)|浏览(240)

我一直在纠结如何对一个场景进行单元测试,我多次遇到这个问题。它与在一个类中模拟一个具有特定返回类型的方法有关。假设我们有一个类:

export class ExampleService {

   async findUsers() : Promise<Users[]> {
      const repository = getRepository(repoConfig);
      return repository.find()
   };

}

下面是我尝试测试的服务:

import { ExampleService } from './ExampleService.ts'

class ToBeTestedService{ 
  async findHomeOwners() : Promise<Users[]> {
  
    const exampleService = new ExampleService();
    const users = await exampleService.findUsers();
    homeOwners = users.map((user) => return user.home == true)); 
    return homeOwners;
  }
}

不要介意代码的正确性(这只是一个示例)。因此,我面临的问题是如何模拟ExampleService中的findUsers方法。我可以模拟整个服务,但无法模拟对该方法的响应(因为它默认设置为未定义)。
下面是我在测试文件中使用的方法。

jest.mock('../ExampleService');

describe('Unit Test: Example Service', () => {

   test('findHomeOwners', async () => {
      
     const exampleService = new ExampleService();
     jest
     .spyOn(exampleService , 'findUsers')
     .mockImplementationOnce(() => {
        return ExampleServiceMock.findUsers();
      }); 
   }
}

我还创建了一个ExampleServiceMock.findUsers,它返回一个带有测试值的User[]类型的promise。这里的问题是,由于我没有将类的示例传递给服务,我的方法的模拟实现似乎没有被应用。在调试ToBeTestedService时,我可以看到exampleService.findUsers()总是返回undefined。
关于我如何克服这个问题有什么想法/建议吗?提前感谢

qvtsj1bj

qvtsj1bj1#

所以我设法为我的问题找到了一个asnwer。如果有人面临类似的问题,解决它的方法是做以下事情:

jest
 .spyOn(ExampleService.prototype, 'findUsers')
 .mockImplementationOnce(() => {
    return ExampleServiceMock.findUsers();
  });

因此,我所做的不是模拟示例服务示例上的方法,而是模拟类中的实际方法,这样,当创建类的示例时,具有所需模拟实现的方法

相关问题