- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 apollo 钩子(Hook)( useQuery
, useMutation
)对 React 组件进行单元测试,并且在测试中我使用 apollo 的 MockedProvider
模拟实际查询.问题是有时,我的模拟与组件实际发出的查询不匹配(创建模拟时的拼写错误,或者组件演变并更改了一些查询变量)。发生这种情况时,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();
});
最佳答案
我已提交 Github issue给 Apollo 团队,以便提出一种内置的方法来做到这一点。同时,这是我自制的解决方案。
这个想法是给 MockedProvider
自定义 Apollo 链接。默认情况下,它使用 MockLink
用给定的模拟初始化。取而代之的是,我创建了一个自定义链接,它是由 MockLink
组成的链。我以相同的方式创建 MockedProvider
会成功,然后是一个 apollo 错误链接,它拦截请求可能返回的错误,并将它们记录在控制台中。为此,我创建了一个自定义提供程序 MyMockedProvider
.
MyMockedProvider.js
import React from 'react';
import {MockedProvider} from '@apollo/react-testing';
import {MockLink} from '@apollo/react-testing';
import {onError} from "apollo-link-error";
import {ApolloLink} from 'apollo-link';
export function MyMockedProvider(props) {
let {mocks, ...otherProps} = props;
let mockLink = new MockLink(mocks);
let errorLoggingLink = onError(({ graphQLErrors, networkError }) => {
if (graphQLErrors)
graphQLErrors.map(({ message, locations, path }) =>
console.log(
`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
),
);
if (networkError) console.log(`[Network error]: ${networkError}`);
});
let link = ApolloLink.from([errorLoggingLink, mockLink]);
return <MockedProvider {...otherProps} link={link} />;
}MyArticleComponent.test.js
import React from 'react';
import {render, cleanup} from '@testing-library/react';
import {MyMockedProvider} from './MyMockedProvider';
import {MyArticleComponent, gqlArticle} from './MyArticleComponent';
afterEach(cleanup);
it('logs MockedProvider warning about the missing mock to the console', 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"
}
}
}
}];
let consoleLogSpy = jest.spyOn(console, 'log');
const {container, findByText} = render(
<MyMockedProvider mocks={gqlMocks}>
<MyArticleComponent />
</MyMockedProvider>
);
let expectedConsoleLog = '[Network error]: Error: No more mocked responses for the query: query Article($id: ID) {\n' +
' article(id: $id) {\n' +
' title\n' +
' content\n' +
' __typename\n' +
' }\n' +
'}\n' +
', variables: {"id":5}';
await findByText('{"loading":false}');
expect(consoleLogSpy.mock.calls[0][0]).toEqual(expectedConsoleLog);
});
关于reactjs - Apollo 的 MockedProvider 没有明确警告丢失的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60100062/
在 Storybook 中使用 MockedProvider 似乎没有返回任何内容。 将我的组件包装在 MockedProvider 中时,它不再抛出没有 Apollo 客户端的错误。所以这证明了Mo
在 Storybook 中使用 MockedProvider 似乎没有返回任何内容。 将我的组件包装在 MockedProvider 中时,它不再抛出没有 Apollo 客户端的错误。所以这证明了Mo
一些背景知识:我有一个在加载时立即调用 useQuery 钩子(Hook)的组件。在该查询运行时,我旋转了一个加载微调器。完成后,我会根据数据渲染内容。 我添加了 useEffect监视查询结果并记录
我有一个使用 Apollo Boost 的工作测试 MockedProvider ,Jest 和 React 测试库,当我将返回的字段更改为 graphQL fragment它停止工作。我错过了什么?
我正在使用 apollo 钩子(Hook)( useQuery , useMutation )对 React 组件进行单元测试,并且在测试中我使用 apollo 的 MockedProvider 模拟
我正在使用 jest与 react-apollo 的 MockedProvider我遇到了麻烦,因为 MockedProvider似乎是异步行为。 给定以下简单组件: const Component
我正在尝试测试在运行突变后应使用新数据更新的组件。我在下面发布了示例代码。你可以找到它on GitHub as runnable repository as well . 不幸的是,我没有找到一种方法
在我的 React 故事书中,我希望能够玩弄使用 graphQL 查询和突变(用 Apollo 实现)的组件。 只要我提前指定确切的突变,包括它们的输入,这使用 MockedProvider 就可以正
我有一个简单的 Apollo 设置。在这个 CodeSandbox 示例中,我使用的是 MockedProvider 但实时代码也可以使用: https://codesandbox.io/s/wint
这是我如何使用 MockedProvider。如何在 mocks 数组中模拟 refetch? const mocks = [{ request: { quer
我是一名优秀的程序员,十分优秀!