【问题标题】:How to mock gmail in service.spec file in nestjs and how to test this?如何在nestjs的service.spec文件中模拟gmail以及如何测试它?
【发布时间】:2020-12-30 02:51:29
【问题描述】:

这是服务文件...我无法为此编写测试用例。这些方法由端点进一步调用,我已经测试了控制器并且它正在工作但无法测试服务。服务方法获取消息正在调用外部库中的方法

constructor() {
        const googleAuth={
            client_id: "soemValue",
            client_secret: "value",
            refresh_token: "value",
            grant_type: 'value',
            url:"testurl"
      }
          this.authProvider = new GoogleAuthProvider(googleAuth);
      this.gmail = new GMail(this.authProvider)
    }
    auth(){}
   async getMessages(data)
    {
        return await this.gmail.getMessages(data)
    }

这是 spec.ts 测试文件

 let service: GmailService;
  let gmail2 :typeof gmail
  console.log(gmail)
  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [GmailService["gmail"]],
      providers: [GmailService,
        {provide:GMail,userFactory:gmailAuth}
      ],
    }).compile();
    gmail2=module.get<GmailService["gmail"]>(GmailService["gmail"])
    service = module.get<GmailService>(GmailService);
  });
  afterEach(()=>{
    jest.restoreAllMocks()
    jest.resetAllMocks()
  })
  it('should be defined',async () => {
    expect(service).toBeDefined();
  });
  it('tests getAll Messages',async ()=>{
    const data={
      "userId":"xyz@gmail.com"
    }
    const result = [{"id": "17642342141234b",
      "threadId": "14234234b"}]
    // gmail.getMessages(data).mockResolvedValue('someValue')
    //  expect(gmail.getMessages(data)).not.toHaveBeenCalled();
    //  const result= await service.getMessages(data)
    //  expect(gmail.getMessages(data)).toHaveBeenCalled()
    //  expect(result).toEqual('someValue')
    // jest.spyOn(service,"getMessages").mockImplementation(async()=> Promise.resolve(result))
    // const response= await service.getMessages(data)
    // expect(response).toBe('xyz')
    const response = {
      json:(body?: any)=>[{}],
    }

      

      expect(await service.getMessages(response)).toBe(result)
  })
});

【问题讨论】:

    标签: typescript nestjs


    【解决方案1】:

    我们在 Discord 上讨论过这个问题,但我想我会在这里提供一个答案,以便它至少可以搜索。要模拟未通过 Nest 的 DI 系统注入的类,您需要使用 jest.mock() 方法为这些类提供自定义模拟。为此,一般情况如下:

    jest.mock(<library-name>, () => {
      return {
        exportedClass1: jest.fn(),
        exportedClass2: jest.fn(),
      }
    });
    

    (如果您使用的是命名导出而不是默认导出)

    从这里,您可以使这些jest.fn() 方法返回类的模拟实现。在这种情况下,我能够提供这样的模拟:

    import { Test } from '@nestjs/testing';
    import { AppService } from './app.service';
    import { GMail } from './cloud-access';
    
    const createMessageMock = jest.fn(() => 'mocked!');
    jest.mock('./cloud-access', () => {
      return {
        GMail: jest.fn(() => ({
          createMessage: createMessageMock,
        })),
        GoogleAuthProvider: jest.fn(() => {
          key: 'value';
        }),
      };
    });
    
    describe('AppService', () => {
      let service: AppService;
    
      beforeEach(async () => {
        const modRef = await Test.createTestingModule({
          providers: [AppService],
        }).compile();
        service = modRef.get(AppService);
      });
    
      describe('createMessage', () => {
        it('should create a message', async () => {
          expect(await service.createMessage({ hello: 'world' })).toBe('mocked!');
          expect((GMail as jest.Mock).mock.calls.length).toBe(1);
          expect(createMessageMock).toBeCalledWith({ hello: 'world' });
        });
      });
    });
    

    此测试运行没有问题,并允许模拟未注入的类。 Jest 在此 can be found here 上的文档

    【讨论】:

      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 2021-07-25
      • 1970-01-01
      • 2020-10-10
      • 2023-03-24
      相关资源
      最近更新 更多