节点模块的玩笑重置模拟

时间:2019-05-09 09:51:15

标签: jestjs google-cloud-functions

我正在进行Google Cloud Functions测试。

文件如下:

  • index.ts仅导出也在此导入的功能。
if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'contactSupportByMail') {
  exports.contactSupportByMail = require('./contactSupportByMail');
}
  • contactSupportByMail.ts要测试的功能。

测试:

describe('Cloud Functions', (): void => {
  let myFunctions;
  let adminInitStub;

  beforeAll((): void => {
    // [START stubAdminInit]
    // If index.js calls admin.initializeApp at the top of the file,
    // we need to stub it out before requiring index.js. This is because the
    // functions will be executed as a part of the require process.
    // Here we stub admin.initializeApp to be a dummy function that doesn't do anything.
    adminInitStub = sinon.stub(admin, 'initializeApp');
    testEnv.mockConfig({
      sendgrid: {
        key: 'apiKey',
      },
      brand: {
        support_email: 'supportEmail',
      },
    });
    // [END stubAdminInit]
  });

  afterAll((): void => {
    // Restore admin.initializeApp() to its original method.
    adminInitStub.restore();
    // Do other cleanup tasks.
    process.env.FUNCTION_NAME = '';
    myFunctions = undefined;
    testEnv.cleanup();
  });

  describe('contactSupportByMail', (): void => {
    // Mocking node_modules library before the require
    jest.mock('@sendgrid/mail', (): { [key: string]: any } => ({
      setApiKey: (): void => { },
      send: (): Promise<any> => Promise.resolve('ok'),
    }));

    // Setting up cloud function name
    process.env.FUNCTION_NAME = 'contactSupportByMail';
    // Importing the index file
    myFunctions = require('../src/index');

    const wrapped = testEnv.wrap(myFunctions.contactSupportByMail);

    it('it should export contactSupportByMail', (): void => {
      const cFunction = require('../src/contactSupportByMail');
      assert.isObject(myFunctions);
      assert.include(myFunctions, { contactSupportByMail: cFunction });
    });

    it('should fully work', async (): Promise<void> => {
      const onCallObjects: [any, ContextOptions] = [
        { mailBody: 'mailBody', to: 'toEmail' },
        { auth: { token: { email: 'userEmail' } } },
      ];

      return assert.deepEqual(await wrapped(...onCallObjects), { ok: true });
    });

    it('not auth', async (): Promise<void> => {
      await expect(wrapped(undefined)).rejects.toThrow('The function must be called while authenticated.');
    });

    it('sendgrid error', async (): Promise<void> => {
      // Mocking node_modules library before the require
      jest.mock('@sendgrid/mail', (): { [key: string]: any } => ({
        setApiKey: (): void => { },
        send: (): Promise<any> => Promise.reject('errorsengrid'),
      }));

      // Importing the index file
      const a = require('../src/index');

      const wrapped_2 = testEnv.wrap(a.contactSupportByMail);

      const onCallObjects: [any, ContextOptions] = [
        { mailBody: 'mailBody', to: 'toEmail' },
        { auth: { token: { email: 'userEmail' } } },
      ];

      await expect(wrapped_2(...onCallObjects)).rejects.toThrow('errorsengrid');
    });
  });
});

问题正在激怒sendgrid error。我不知道如何重置contactSupportByMail内部所需的sendgrid库的模拟。首次对其进行模拟后,它总是返回已解决的send函数。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法:

afterEach((): void => {
  jest.resetModules();
});