sinon存根第一个api调用和间谍第二个api调用

时间:2018-11-10 02:12:35

标签: javascript fetch sinon

我有这样的方法

fetch('first api')
    .then(resp => {
        if (resp.status === '500') {
            return Promise.reject('some error');
        }
        return fetch('second api');
     })
     .then(resp => {
         // do something;
     })
     .catch(resp => {
        // do something;
     });

我像第一个那样调用第一个提取调用

const stub = sinon.stub(window, 'fetch');

现在可以测试成功呼叫

stub.withArgs('first api').returns(Promise.resolve(//window.Response));

或失败

stub.withArgs('first api').returns(Promise.reject(//window.Response));

有两个问题:

  1. 在第一个api错误的情况下,我如何spy不调用第二个提取api?
  2. 如何在两个提取调用都解决后,同时对两个提取调用进行存根并测试是否调用了最后一个then

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在存根上使用间谍API。因此,如果您制作fetch的存根,则可以使用onFirstCall().resolves('some value')之类的所有工具来返回承诺以及calledTwice之类的间谍属性。

例如,返回两个不同的承诺并测试两次fetch被调用,您可以:

function run(){
  return fetch('first api')
    .then(resp => {
        if (resp.status === '500') {
            return Promise.reject('some error');
        }
        return fetch('second api');
     })
     .then(resp => {
         // do something;
     })
     .catch(resp => {
        // do something;
     });
}

let stub = sinon.stub(window, 'fetch')
stub.onFirstCall().resolves("testing first")
stub.onSecondCall().resolves("testing second")

run().then(()=> console.log("called twice: ", stub.calledTwice))
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.1.1/sinon.min.js"></script>

要测试已拒绝的承诺,请使用stub.rejects('some values')