Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试调用异步函数的组件_Javascript_Reactjs_Unit Testing_Sinon_Stub - Fatal编程技术网

Javascript 测试调用异步函数的组件

Javascript 测试调用异步函数的组件,javascript,reactjs,unit-testing,sinon,stub,Javascript,Reactjs,Unit Testing,Sinon,Stub,我有一个react组件,它调用作为prop传入的async函数,然后调用then函数中的另一个函数 下面我把它简单化,作为一个例子 例如 在我的例子中,只有第一个期望是正确的。我的sinon.stub设置是否有问题?或者我在期待什么?这感觉像是一件小事,但我无法确定你说得很对,只是需要一点小小的改变: 然后将回调排队等待执行。当当前同步代码完成并且事件循环捕获下一个排队的内容时,将执行回调 测试正在运行到完成,并在排队的回调之前失败,然后onSubmit()中的有机会运行 给事件循环一个循环的机

我有一个
react
组件,它调用作为prop传入的
async
函数,然后调用
then
函数中的另一个函数

下面我把它简单化,作为一个例子

例如


在我的例子中,只有第一个期望是正确的。我的sinon.stub设置是否有问题?或者我在期待什么?这感觉像是一件小事,但我无法确定你说得很对,只是需要一点小小的改变:

然后
将回调排队等待执行。当当前同步代码完成并且事件循环捕获下一个排队的内容时,将执行回调

测试正在运行到完成,并在
排队的回调之前失败,然后
onSubmit()中的
有机会运行

给事件循环一个循环的机会,这样回调就有机会执行,这应该可以解决问题。这可以通过使您的测试函数异步并等待一个已解决的承诺来完成,您希望暂停测试并让任何排队回调执行:

it('should doSomething then call closeModal', async () => {

  const doSomethingStub = sinon.stub().resolves()
  const closeModalStub = sinon.stub()

  const props = {
    doSomething: doSomethingStub,
    closeModal: closeModalStub
  }

  const wrapper = shallow(<Form {...props}/>)

  wrapper.find(`form`).simulate(`submit`);

  // Pause the synchronous test here and let any queued callbacks execute
  await Promise.resolve();

  expect(doSomethingStub.called).toEqual(true)
  expect(closeModalStub.called).toEqual(true)

});
it('shouldnosomething然后调用closeModal',async()=>{
const doSomethingStub=sinon.stub().resolves()
const closeModalStub=sinon.stub()
常量道具={
doSomething:doSomethingStub,
closeModal:closeModalStub
}
常量包装器=浅()
find(`form`).simulate(`submit`);
//在此处暂停同步测试,并让任何排队回调执行
等待承诺;
expect(doSomethingStub.called).toEqual(true)
expect(closeModalStub.called).toEqual(true)
});

很好,谢谢,我知道我会错过一些愚蠢的事情,我的分歧在于我认为
stub.resolves()
将返回一个承诺,该承诺将得到解决,但在测试中我不知道如何
等待该承诺。
it('should doSomething then call closeModal', () => {

  const doSomethingStub = sinon.stub().resolves()
  const closeModalStub = sinon.stub()

  const props = {
    doSomething: doSomethingStub,
    closeModal: closeModalStub
  }

  const wrapper = shallow(<Form {...props}/>)

  wrapper.find(`form`).simulate(`submit`)

  expect(doSomethingStub.called).toEqual(true)
  expect(closeModalStub.called).toEqual(true)

})
it('should doSomething then call closeModal', async () => {

  const doSomethingStub = sinon.stub().resolves()
  const closeModalStub = sinon.stub()

  const props = {
    doSomething: doSomethingStub,
    closeModal: closeModalStub
  }

  const wrapper = shallow(<Form {...props}/>)

  wrapper.find(`form`).simulate(`submit`);

  // Pause the synchronous test here and let any queued callbacks execute
  await Promise.resolve();

  expect(doSomethingStub.called).toEqual(true)
  expect(closeModalStub.called).toEqual(true)

});