Jest сброс макета узла модуля - PullRequest
0 голосов
/ 09 мая 2019

Я работаю над тестами облачных функций Google.

Эти файлы:

  • 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. Я не знаю, как сбросить макет библиотеки sendgrid, который требуется внутри contactSupportByMail. После первого насмешки он всегда возвращает функцию send в соответствии с разрешением.

1 Ответ

0 голосов
/ 09 мая 2019

Я наконец-то получил решение:

afterEach((): void => {
  jest.resetModules();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...