Asserting function calls inside a promise

孤街浪徒 提交于 2019-12-06 03:44:51

mkdir isn't called asynchronously here, so it's rather trivial to test:

mkdir = sinon.stub().resolves("test/dir")
foo(testparams)
assert(mkdir.calledOnce)
assert(mkdir.calledWith(testparams))
…

If you want to test that writeFile was called, that's only slightly more complicated - we have to wait for the promise returned by foo before asserting:

… // mdir like above
writeFile = sinon.stub().resolves("result")
return foo(testparams).then(r => {
    assert.strictEqual(r, "result")
    assert(writeFile.calledOnce)
    assert(writeFile.calledWith("test/dir"))
    …
})

You can mock the mkdir function then use setTimeout to check whether or not this function is called.

describe('foo', () => {
  it('should call mkdir', () => {
    return new Promise((resolve, reject) => {
      let originalFunction = mkdir;
      let timer = setTimeout(() => {
        reject(`mkdir has not been called`);
      });
      mkdir = (...params) => new Promise(mkdirResolve => {
        //restore the original method as soon as it is invoked
        mkdir = originalMethod;
        clearTimeout(timer);
        mkdirResolve(someExpectedData);
        resolve();
      });
      foo(params);
    });
  });
});
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!