【发布时间】:2019-08-18 16:36:42
【问题描述】:
我正在使用 Typescript 和新的 React 钩子为一个简单的 React 应用程序编写一些玩笑酶测试。
但是,我似乎无法正确模拟在 useEffect 挂钩内进行的 api 调用。
useEffect 进行 api 调用并使用“setData”更新useState 状态“data”。
然后将对象“数据”映射到一个表格中到其对应的表格单元格。
这似乎应该很容易通过模拟 api 响应和酶安装来解决,但我不断收到错误消息,告诉我使用 act() 进行组件更新。
我尝试了多种方式使用act(),但无济于事。我尝试用 fetch 替换 axios 并使用酶浅层和 react-test-library 的渲染,但似乎没有任何效果。
组件:
import axios from 'axios'
import React, { useEffect, useState } from 'react';
interface ISUB {
id: number;
mediaType: {
digital: boolean;
print: boolean;
};
monthlyPayment: {
digital: boolean;
print: boolean;
};
singleIssue: {
digital: boolean;
print: boolean;
};
subscription: {
digital: boolean;
print: boolean;
};
title: string;
}
interface IDATA extends Array<ISUB> {}
const initData: IDATA = [];
const SalesPlanTable = () => {
const [data, setData] = useState(initData);
useEffect(() => {
axios
.get(`/path/to/api`)
.then(res => {
setData(res.data.results);
})
.catch(error => console.log(error));
}, []);
const renderTableRows = () => {
return data.map((i: ISUB, k: number) => (
<tr key={k}>
<td>{i.id}</td>
<td>
{i.title}
</td>
<td>
{i.subscription.print}
{i.mediaType.digital}
</td>
<td>
{i.monthlyPayment.print}
{i.monthlyPayment.digital}
</td>
<td>
{i.singleIssue.print}
{i.singleIssue.digital}
</td>
<td>
<button>Submit</button>
</td>
</tr>
));
};
return (
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>MediaType</th>
<th>MonthlyPayment</th>
<th>SingleIssue</th>
<th/>
</tr>
</thead>
<tbody'>{renderTableRows()}</tbody>
</table>
);
};
export default SalesPlanTable;
测试:
const response = {
data: {
results: [
{
id: 249,
mediaType: {
digital: true,
print: true
},
monthlyPayment: {
digital: true,
print: true
},
singleIssue: {
digital: true,
print: true
},
subscription: {
digital: true,
print: true
},
title: 'ELLE'
}
]
}
};
//after describe
it('should render a proper table data', () => {
const mock = new MockAdapter(axios);
mock.onGet('/path/to/api').reply(200, response.data);
act(() => {
component = mount(<SalesPlanTable />);
})
console.log(component.debug())
});
我希望它记录表格的 html 并呈现表格正文部分,我尝试了一些异步和不同的方法来模拟 axios,但我一直只得到表格标题或消息:@987654330 的更新@ inside a test is not Wrap in act(...). 我找了好几个小时才找到解决办法,但找不到任何可行的方法,所以我决定鼓起勇气在这里问。
【问题讨论】:
-
so I decided to muster up some courage and ask here...我们没那么可怕吧? :)(好问题,顺便说一句) -
哈哈我前段时间在这里问过一些东西,但我对 javascript 的经验不够丰富,在问之前没有彻底搜索过这里,所以它立即被删除了:(
标签: typescript jestjs axios enzyme react-hooks