Я делаю модульные тесты для компонентов React, используя хуки apollo (useQuery
, useMutation
), а в тестах я высмеиваю фактические запросы с помощью MockedProvider
apollo. Проблема в том, что иногда мой макет не соответствует запросу, фактически сделанному компонентом (либо опечатка при создании макета, либо компонент развивается и изменяет некоторые переменные запроса). Когда это происходит, MockedProvided
возвращает NetworkError компоненту. Однако в тестовом наборе предупреждение не отображается. Это расстраивает, потому что иногда мои компоненты ничего не делают с ошибкой, возвращаемой useQuery
. Это заставляет мои тесты, которые раньше проходили, внезапно молча проваливаться, и мне трудно найти причину.
Это пример использования компонента useQuery
:
import React from 'react';
import {gql} from 'apollo-boost';
import {useQuery} from '@apollo/react-hooks';
export const gqlArticle = gql`
query Article($id: ID){
article(id: $id){
title
content
}
}
`;
export function MyArticleComponent(props) {
const {data} = useQuery(gqlArticle, {
variables: {
id: 5
}
});
if (data) {
return (
<div className="article">
<h1>{data.article.title}</h1>
<p>{data.article.content}</p>
</div>
);
} else {
return null;
}
}
И это модульный тест, в котором я допустил ошибку, потому что объект переменных для макета равен {id: 6}
вместо {id: 5}
, который будет запрашиваться компонентом.
it('the missing mock fails silently, which makes it hard to debug', async () => {
let gqlMocks = [{
request:{
query: gqlArticle,
variables: {
/* Here, the component calls with {"id": 5}, so the mock won't work */
"id": 6,
}
},
result: {
"data": {
"article": {
"title": "This is an article",
"content": "It talks about many things",
"__typename": "Article"
}
}
}
}];
const {container, findByText} = render(
<MockedProvider mocks={gqlMocks}>
<MyArticleComponent />
</MockedProvider>
);
/*
* The test will fail here, because the mock doesn't match the request made by MyArticleComponent, which
* in turns renders nothing. However, no explicit warning or error is displayed by default on the console,
* which makes it hard to debug
*/
let titleElement = await findByText("This is an article");
expect(titleElement).toBeDefined();
});
Как я могу отобразить явное предупреждение в консоли?