问题描述
我没有模拟 axios 请求,而是尝试使用 msw 测试组件,但是在请求之后我没有获得组件中内容的可见性,我做错了什么?
我的组件
import React,{useEffect,useState} from 'react'
import axios from "axios";
export default function TestPage() {
const [testData,setTestData] = useState('')
useEffect(() => {
const getSomeData = async () => {
const data = await axios.get('https://jsonplaceholder.typicode.com/todos/1')
setTestData(data.data.title)
}
getSomeData()
},[])
return (
<div className='test'>
<h1>{testData}</h1>
</div>
)
}
我的测试文件
import React from 'react'
import { rest } from 'msw';
import { setupServer } from 'msw/node';
import {render,act,screen} from '@testing-library/react'
import '@testing-library/jest-dom/extend-expect'
import TestPage from "../testPage";
const allUsers = [
{title:'User'}
]
const server = setupServer(
rest.get('https://jsonplaceholder.typicode.com/todos/1',async (req,res,ctx) => {
return res(ctx.json( {data: allUsers} ));
})
);
beforeAll(() => server.listen());
afterEach(() => server.resetHandlers())
afterall(() => server.close());
test('loads and displays greeting',async () => {
await act(async () => {
await render(<TestPage/>)
})
await screen.findByText('User') //I have no response content here
screen.debug()
})
解决方法
您不需要为 10 silly lifecycle mobile-tiku@0.0.1~start: Args: [ '-c','umi dev' ]
11 silly lifecycle mobile-tiku@0.0.1~start: Returned: code: 1 signal: null
12 info lifecycle mobile-tiku@0.0.1~start: Failed to exec start script
13 verbose stack Error: mobile-tiku@0.0.1 start: `umi dev`
13 verbose stack Exit status 1
13 verbose stack at EventEmitter.<anonymous> (/Users/lixiaokai/.nvm/versions/node/v12.22.1/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
13 verbose stack at EventEmitter.emit (events.js:314:20)
13 verbose stack at ChildProcess.<anonymous> (/Users/lixiaokai/.nvm/versions/node/v12.22.1/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack at ChildProcess.emit (events.js:314:20)
13 verbose stack at maybeClose (internal/child_process.js:1022:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:287:5)
定义 data
字段,ctx.json()
方法的解析值具有 axios.get()
字段。
另外,API 返回的 data
是一个数组。
您不需要使用 data
辅助函数,在您的测试中使用 async utilities 之一(如 act
或 { {1}} 个查询就足够了。
例如
waitFor
:
find*
TestPage.tsx
:
import React,{ useEffect,useState } from 'react';
import axios from 'axios';
export default function TestPage() {
const [testData,setTestData] = useState('');
useEffect(() => {
const getSomeData = async () => {
const res = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
console.log(res.data);
setTestData(res.data[0]?.title);
};
getSomeData();
},[]);
return (
<div className="test">
<h1>{testData}</h1>
</div>
);
}
测试结果:
TestPage.test.tsx