Почему функция 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