Создайте Испытанные Шутливые Тесты для получения с Ферментом
У меня проблемы с созданием поддельных тестов Jest для компонентов React, которые вызывают fetch. В частности, если я напишу провальный тест, Jest взорвется и пинает меня обратно в оболочку bash. Чтобы начать снова, я должен перезапустить мои тесты.
Вот урезанная версия моего компонента
class App extends Component {
constructor(props) {
super(props);
this.state = { file: 'unknown' };
}
queryServer = async() => {
const that = this;
return fetch('/api/foo')
.then(function (response) {
return response.json();
})
.then(function (json) {
that.setState(() => { return {'file': 'api.js'}; });
});
};
render() {
return (
<div>
<p>File: {this.state.file}</p>
<button id='qs' onClick={this.queryServer}>Server</button>
</div>);
}
}
Затем я создаю макет fetch и пишу тест, который включает в себя вызовы setImmediate и wrapper.update. Этот код работает, но он взорвется, если я напишу плохой тест:
describe('Jest Create React Tests', function () {
beforeEach(() => {
global.fetch = jest.fn().mockImplementation(() => {
const promise = new Promise((resolve, reject) => {
resolve({
ok: true,
json: function () {
return {file: 'api.js'};
}
});
});
return promise;
});
});
it('renders test', () => {
const wrapper = shallow(<App/>);
const fileParagraph = <p>File: api.js</p>;
wrapper.find('#qs').simulate('click');
setImmediate(() => {
wrapper.update();
expect(wrapper.contains(fileParagraph)).toEqual(true);
});
});
});
Как я уже сказал, это взрывает Jest, если мое ожидаемое утверждение не выполняется. Это заставляет меня чувствовать, что я делаю что-то не так. Есть ли какой-нибудь более простой способ сделать такие тесты?
Я попытался использовать setTimeout вместо setImmediate, и это работает, но на самом деле ничего не дает и стоит несколько строк кода, так как мне нужно использовать параметр async done test. Это не взрывает Jest, но ведет себя плохо без попытки.. поймать.. наконец. Я также пробовал async и жду, но я не могу заставить этот код работать.
При использовании setImmediate я могу сделать это, чтобы предотвратить сбой, но это делает мой код ужасно многословным:
try {
expect(wrapper.contains(statusParagraph)).toBe(true);
} catch (e) {
console.log(e);
}
Любые идеи о том, как сделать это проще и надежнее?