【发布时间】:2019-05-29 07:35:52
【问题描述】:
我正在尝试测试一个 async/await 函数,该函数使用 axios 进行 api 调用以获取用户。我是测试 React 应用程序和使用 JEST(第一次尝试)的新手,无法运行测试。
我尝试在 JEST 中使用模拟函数。我的代码如下:
// component --users
export default class Users extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.getUsers = this.getUsers.bind(this);
}
/*does an api request to get the users*/
/*async await used to handle the asynchronous behaviour*/
async getUsers() {
// Promise is resolved and value is inside of the resp const.
try {
const resp = await axios.get(
"https://jsonplaceholder.typicode.com/users"
);
if (resp.status === 200) {
const users = resp.data;
/* mapped user data to just get id and username*/
const userdata = users.map(user => {
var userObj = {};
userObj["id"] = user.id;
userObj["username"] = user.username;
return userObj;
});
return userdata;
}
} catch (err) {
console.error(err);
}
}
componentDidMount() {
this.getUsers().then(users => this.setState({ users: users }));
}
/*****************************************************************/
//props(userid ,username) are passed so that api call is made for
//getting posts of s psrticular user .
/*****************************************************************/
render() {
if (!this.state.users) {
return (
<div className="usersWrapper">
<img className="loading" src="/loading.gif" alt="Loading.." />
</div>
);
}
return (
<div className="usersWrapper">
{this.state.users.map(user => (
<div key={user.id}>
<Posts username={user.username} userid={user.id} />
</div>
))}
</div>
);
}
}
//axios.js-mockaxios
export default {
get: jest.fn(() => Promise.resolve({ data: {} }))
};
//users.test.js
describe("Users", () => {
describe("componentDidMount", () => {
it("sets the state componentDidMount", async () => {
mockAxios.get.mockImplementationOnce(
() =>
Promise.resolve({
users: [
{
id: 1,
username: "Bret"
}
]
}) //promise
);
const renderedComponent = await shallow(<Users />);
await renderedComponent.update();
expect(renderedComponent.find("users").length).toEqual(1);
});
});
});
测试失败 -
失败 src/components/users.test.js (7.437s) ● 用户 › componentDidMount › 设置状态 componentDidMount
expect(received).toEqual(expected)
期望值等于: 1 已收到: 0
请帮我找出问题所在。我对测试 reactapps 完全陌生
【问题讨论】:
-
您问题中的代码没有显示
getUsers的调用方式,也没有显示您的测试断言。有没有您遗漏的componentDidMount方法?还是您的测试直接致电getUsers?如果删除try/catch会发生什么? -
getUsers() 在 componentDidMount() 中被调用。它在发布的代码中。
-
非常抱歉;我以某种方式错过了滚动条。
-
shallow不是异步方法,在它之前不需要await。看起来测试提前完成,然后组件在获得用户后重新渲染,您可以检查setTimeout( () => expect(renderedComponent.find("users").length).toEqual(1), 0)(在测试的最后)吗? -
您提供的解决方案似乎有效。通过测试。谢谢。
标签: reactjs async-await jestjs enzyme