【发布时间】:2018-03-24 22:13:09
【问题描述】:
谁能告诉我在安装调用componendDidMount()的组件时如何开玩笑地等待一个模拟的承诺解决?
class Something extends React.Component {
state = {
res: null,
};
componentDidMount() {
API.get().then(res => this.setState({ res }));
}
render() {
if (!!this.state.res) return
return <span>user: ${this.state.res.user}</span>;
}
}
API.get() 在我的笑话测试中被嘲笑
data = [
'user': 1,
'name': 'bob'
];
function mockPromiseResolution(response) {
return new Promise((resolve, reject) => {
process.nextTick(
resolve(response)
);
});
}
const API = {
get: () => mockPromiseResolution(data),
};
然后是我的测试文件:
import { API } from 'api';
import { API as mockAPI } from '__mocks/api';
API.get = jest.fn().mockImplementation(mockAPI.get);
describe('Something Component', () => {
it('renders after data loads', () => {
const wrapper = mount(<Something />);
expect(mountToJson(wrapper)).toMatchSnapshot();
// here is where I dont know how to wait to do the expect until the mock promise does its nextTick and resolves
});
});
问题是我 expect(mountToJson(wrapper)) 正在返回 null,因为 <Something /> 的模拟 api 调用和生命周期方法尚未通过。
【问题讨论】:
-
如果它与 jasmine 一起运行,您可以使用
jasmine.clock().install(); jasmine.clock().tick(1)进行“时间旅行”,这应该足以完成您的下一个滴答。测试结束后别忘了运行jasmin.clock().uninstall()否则时钟会静止 -
很遗憾没有使用 jasmine,使用的是 jest expect 库
-
玩笑似乎有类似的描述here