Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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/2/unit-testing/4.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_Unit Testing_Promise_Mocha.js - Fatal编程技术网

Javascript 单元测试因超时而失败

Javascript 单元测试因超时而失败,javascript,unit-testing,promise,mocha.js,Javascript,Unit Testing,Promise,Mocha.js,我在Axios XHR库周围有一个包装器,我正在尝试为我的代码编写一些单元测试。然而,当我运行测试时,它们都失败了,告诉我超时超过了。为了运行断言,我需要如何构造测试 以下是包装器代码: export const clientRequest = (xhrClient, endpoint, params = {}) => { const method = params.method || 'get' const {config, data, noOrg, unrestricted}

我在Axios XHR库周围有一个包装器,我正在尝试为我的代码编写一些单元测试。然而,当我运行测试时,它们都失败了,告诉我超时超过了。为了运行断言,我需要如何构造测试

以下是包装器代码:

export const clientRequest = (xhrClient, endpoint, params = {}) => {
  const method = params.method || 'get'
  const {config, data, noOrg, unrestricted} = params

  let reqParams = data
  if (!isNil(data) && method === 'get') {
    reqParams = {params: data}
  }

  const authConfig = unrestricted ? {...config, withCredentials: false} :
    {...config, withCredentials: true}

  const concatEndpoint = noOrg ? endpoint :
    `${Cookies.get('organization') || 'default' }${endpoint}`

  return new Promise((resolve, reject) => {
    xhrClient[method](concatEndpoint, reqParams, authConfig)
      .then(response => resolve(response))
      .catch(err => reject(err))
  })
}
以及有关的测试:

  describe('clientRequest()', () => {
    const resolveSpy = sinon.spy()
    const fakeClient = {
      get: () => new Promise(resolveSpy),
    }

    it.only('should make a call to the supplied method', (done) => {
      const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
      result.then(() => {
        expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
        done()
      })
    })
  })

似乎,
fakeClient.get
从未解析过

由于这是一种应该被监视的方法,我建议将
fakeClient
更改为以下方式:

const fakeClient = {
  get: () => Promise.resolve()
}
sinon.spy(fakeClient, 'get');
添加
catch
调用以处理承诺链中的错误也很重要:

result.then(() => {
  expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
  done()
}).catch(done);

似乎,
fakeClient.get
从未解析过

由于这是一种应该被监视的方法,我建议将
fakeClient
更改为以下方式:

const fakeClient = {
  get: () => Promise.resolve()
}
sinon.spy(fakeClient, 'get');
添加
catch
调用以处理承诺链中的错误也很重要:

result.then(() => {
  expect(resolveSpy).to.have.beenCalledWith('/foobar', undefined, {withCredentials: true})
  done()
}).catch(done);

我最终听从了@MarcoL的建议,并回报了他们的期望

it('should make a call to the supplied method', () => {
  const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
  return result.then(() => (
    expect(resolveSpy).to.have.been.calledWith('/foobar', undefined, {withCredentials: true})
  ))
})

我最终听从了@MarcoL的建议,并回报了他们的期望

it('should make a call to the supplied method', () => {
  const result = xhr.clientRequest(fakeClient, '/foobar', {method: 'get'})
  return result.then(() => (
    expect(resolveSpy).to.have.been.calledWith('/foobar', undefined, {withCredentials: true})
  ))
})

我想我回答不了你的问题。然而,我有一个关于你使用承诺的评论。。。您的
clientRequest
函数以一个返回值结束,该返回值是一个新的承诺,在它的主体中包含一个
then
反应。这似乎与我所学到的承诺背道而驰,因为嵌套的承诺通常(总是?)是一种反模式,应该扁平化。这可能与您当前的问题有关,也可能与您当前的问题无关,我可能没有理解您代码的要点,但您可能希望进一步了解这一点。结果是否承诺调用
然后
内容?2.您确定不需要在
之前的
块中设置
spy
fakeClient
?注意:您只需在测试中返回承诺,而无需使用
done
回调(mocha了解
promissions
并等待返回的承诺完成)@MarcoL删除
done
回调似乎有效。我想知道为什么它会导致它失败?如果你删除“done”回调,你就不会测试任何东西,而是以同步的方式返回。基本上你没有测试任何东西。尝试删除已完成的回调并返回“result.then()”承诺。我想我无法回答您的问题。然而,我有一个关于你使用承诺的评论。。。您的
clientRequest
函数以一个返回值结束,该返回值是一个新的承诺,在它的主体中包含一个
then
反应。这似乎与我所学到的承诺背道而驰,因为嵌套的承诺通常(总是?)是一种反模式,应该扁平化。这可能与您当前的问题有关,也可能与您当前的问题无关,我可能没有理解您代码的要点,但您可能希望进一步了解这一点。结果是否承诺调用
然后
内容?2.您确定不需要在
之前的
块中设置
spy
fakeClient
?注意:您只需在测试中返回承诺,而无需使用
done
回调(mocha了解
promissions
并等待返回的承诺完成)@MarcoL删除
done
回调似乎有效。我想知道为什么它会导致它失败?如果你删除“done”回调,你就不会测试任何东西,而是以同步的方式返回。基本上你没有测试任何东西。尝试删除已完成的回调并返回“result.then()”承诺。顺便说一句,
.then(response=>resolve(response))
可以很容易地替换为
.then(resolve)
。感谢您的提示!不幸的是,解决方案不起作用,它仍然超时。@KevinWhitaker我已经更新了答案-可能是缺少的
捕获
。没有必要捕获。只需返回该语句,“摩卡”就会在内部被捕获,顺便说一句,
。然后(response=>resolve(response))
就可以轻松地替换为
。然后(resolve)
。谢谢你的提示!不幸的是,解决方案不起作用,它仍然超时。@KevinWhitaker我已经更新了答案-可能是缺少的
捕获
。没有必要捕获。只要把这句话还给我,“摩卡咖啡”就会在内部流行起来