Почему функция spyOn в тесте не работает с sendGrid?

Я настраиваю сервер graphql с graphql-yoga и prisma, используя Typescript. Когда пользователь регистрируется, на указанный адрес электронной почты будет отправлено письмо со ссылкой для проверки. Все работает нормально, но я хочу написать тест на мутацию перед рефакторингом функциональности, который проверяет, была ли вызвана функция send в SendGrid.

Я пытался шпионить за функцией с помощью spyOn, но все, что я получаю, это ошибка, которая возникает из-за отсутствия ключа API для SendGrid в среде тестирования.

Я использовал spyOn раньше, и это сработало, хотя я впервые использую jest с Typescript.

Регистрация Мутация

import * as sgMail from '@sendgrid/mail';

sgMail.setApiKey(process.env.MAIL_API_KEY);

export const Mutation = {
    async signUpUser(parent, { data }, { prisma }, info) {
        [...]
        const emailData = {
            from: 'test@test.de',
            to: `${user.email}`,
            subject: 'Account validation',
            text: `validation Id: ${registration.id}`
        };
        await sgMail.send(emailData);

        return user;
    }
}

Пробовать шпион

import * as sgMail from '@sendgrid/mail';

const signUpUserMutation = gql`
    mutation($data: ValidationInput) {
        signUpUser (data: $data) {
            id
            email
        }
    }
`;

it('should send a registration email, with a link, containing the id of the registration', async () => {
    spyOn(sgMail, "send").and.returnValue(Promise.resolve('Success'));
    const variables = {
        data: {
            email: "test@test.de",
            password: "anyPassword"
        }
    };

    await client.mutate({ mutation: signUpUserMutation, variables});
    expect(sgMail.send).toHaveBeenCalled();
});

Запуск теста дает мне:

Error: GraphQL error: Unauthorized

Комментирование вызова функции send в мутации и запуск теста дает мне:

Error: expect(spy).toHaveBeenCalled()

Expected spy to have been called, but it was not called.

0 ответов

Ты не издеваешься @sendgrid/mailмодуль правильно. Вот почему произошла ошибка. Вот решение без использованияGraphQLтестовый клиент. Но вы можете использоватьGraphQL тестовый клиент для проверки вашего GraphQL резольвер и GraphQL Схема после издевательства @sendgrid/mail модуль правильно.

mutations.ts:

import * as sgMail from '@sendgrid/mail';

sgMail.setApiKey(process.env.MAIL_API_KEY || '');

export const Mutation = {
  async signUpUser(parent, { data }, { prisma }, info) {
    const user = { email: 'example@gmail.com' };
    const registration = { id: '1' };
    const emailData = {
      from: 'test@test.de',
      to: `${user.email}`,
      subject: 'Account validation',
      text: `validation Id: ${registration.id}`
    };
    await sgMail.send(emailData);

    return user;
  }
};

mutations.spec.ts:

import { Mutation } from './mutations';
import * as sgMail from '@sendgrid/mail';
import { RequestResponse } from 'request';

jest.mock('@sendgrid/mail', () => {
  return {
    setApiKey: jest.fn(),
    send: jest.fn()
  };
});

describe('Mutation', () => {
  describe('#signUpUser', () => {
    beforeEach(() => {
      jest.resetAllMocks();
    });
    it('should send a registration email, with a link, containing the id of the registration', async () => {
      (sgMail.send as jest.MockedFunction<typeof sgMail.send>).mockResolvedValueOnce([{} as RequestResponse, {}]);
      const actualValue = await Mutation.signUpUser({}, { data: {} }, { prisma: {} }, {});
      expect(actualValue).toEqual({ email: 'example@gmail.com' });
      expect(sgMail.send).toBeCalledWith({
        from: 'test@test.de',
        to: 'example@gmail.com',
        subject: 'Account validation',
        text: `validation Id: 1`
      });
    });
  });
});

Результат модульного тестирования со 100% покрытием:

 PASS  src/stackru/56379585/mutations.spec.ts (12.419s)
  Mutation
    #signUpUser
      ✓ should send a registration email, with a link, containing the id of the registration (23ms)

--------------|----------|----------|----------|----------|-------------------|
File          |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
--------------|----------|----------|----------|----------|-------------------|
All files     |      100 |      100 |      100 |      100 |                   |
 mutations.ts |      100 |      100 |      100 |      100 |                   |
--------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        14.315s

Вот завершенная демонстрация: https://github.com/mrdulin/jest-codelab/tree/master/src/stackru/56379585

Другие вопросы по тегам