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

sinon stub first api call and spy second api call

我有这样的方法

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;
     });

我正在存根第一个 fetch 调用,例如

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. 我如何spy在第一个 api 错误情况下,不调用第二个提取 api?
  2. 我如何存根两个提取调用并测试最后一个 then 在两个提取调用都已解析时被调用?

谢谢。

您可以在存根上使用间谍 api。因此,如果您制作 fetch 的存根,您可以使用所有工具,例如 onFirstCall().resolves('some value') 到 return 承诺以及间谍属性,例如 calledTwice.

例如 return 两个不同的承诺并测试 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')