Javascript 一种更优雅的方式来测试摩卡咖啡的时间流逝

Javascript 一种更优雅的方式来测试摩卡咖啡的时间流逝,javascript,mocha.js,enzyme,Javascript,Mocha.js,Enzyme,我最近不得不用一个旧的react组件修复一个bug。通常在修复bug时,我们会用它编写一个测试。问题是,react组件从服务器进行异步获取(我可以重构代码,以便将异步操作移到redux中,但我们不会将重构作为bug修复的一部分),因此在测试组件应该呈现的内容时,我必须等待500ms,以允许承诺得到解决 我知道如果我创建一个组件实例并直接调用该方法,我就不必执行setTimeout,我可以执行。然后,但我们喜欢在不调用内部方法的情况下测试组件的输入/输出 有比设置超时更优雅的解决方案吗?以下是当前

我最近不得不用一个旧的react组件修复一个bug。通常在修复bug时,我们会用它编写一个测试。问题是,react组件从服务器进行异步获取(我可以重构代码,以便将异步操作移到redux中,但我们不会将重构作为bug修复的一部分),因此在测试组件应该呈现的内容时,我必须等待
500ms
,以允许承诺得到解决

我知道如果我创建一个组件实例并直接调用该方法,我就不必执行setTimeout,我可以执行
。然后
,但我们喜欢在不调用内部方法的情况下测试组件的输入/输出

有比设置超时更优雅的解决方案吗?以下是当前代码:

it('autofills and locks all the fields where user data is present', function(done) {
    const emailInput = $wrapper.find('#email');
    emailInput.value = 'email@example.com';
    emailInput.simulate('blur');

    // - autofill does an async request
    // - we need to wait for the promise to resolve before
    //   checking if the inputs are disabled or not
    setTimeout(() => {
      const identifierInput = $wrapper.find('#id');
      const lastNameInput = $wrapper.find('#last-name');
      const phoneNumberInput = $wrapper.find('#phone-number');
      const firstNameInput = $wrapper.find('#first-name');

      expect(firstNameInput.html().includes('disabled')).to.be.true;
      expect(lastNameInput.html().includes('disabled')).to.be.true;
      expect(phoneNumberInput.html().includes('disabled')).to.be.true;
      expect(identifierInput.html().includes('disabled')).to.be.true;
      done();
    }, 500);
});
“在这里,我们不把重构作为bug修复的一部分”。。。哇

无论如何,如果您需要编写一个测试来完成您的工作,那么您将需要模拟您的API调用。只要网络有点慢,500毫秒超时就会失败,这是一个非常脆弱的测试

因为您没有详细说明请求是如何发出的,所以我不能告诉您任何其他内容,但是您会发现所有HTTP请求风格的模拟库:fetch mock for fetch,nock。。。有很多

我们的想法是,您应该预先设置一个假答案,并立即返回(如果需要,可以使用Promise.resolve())