Создайте Испытанные Шутливые Тесты для получения с Ферментом

У меня проблемы с созданием поддельных тестов 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);
}

Любые идеи о том, как сделать это проще и надежнее?

0 ответов

Другие вопросы по тегам