如何测试在测试函数中未返回的被调用的promise

时间:2017-08-01 08:40:47

标签: javascript node.js testing promise mocha

首先,我已经尝试了几乎所有事情来使这个代码工作,我实现了,问题是我不喜欢这种方法,我想知道是否有更好的东西我可以这样做,以使TEST代码更具可读性,但功能更强。

我想断言(例如sinon第二个函数(secondApiCall)已被调用,但似乎没有办法实现这一目标,你将如何实现这一目标。这是一种非hacky方法吗?

这里的主要问题是"我无法修改functionToTest"我必须编写基本上检查API调用正在进行的测试。

functionToTest完成后,您将如何使用给定的代码运行断言?

PS:代码很糟糕,我知道,但有时候你只需要处理它,你就不能做更多了,谢谢你在重构它之前测试它的内容:(

const firstApiCall = () => {
    return new Promise(function(resolve,reject) {
        setTimeout(() => {
            resolve('firstApiCall success');
        }, 3);
    });
};

const secondApiCall = () => {
    return new Promise(function(resolve,reject) {
        setTimeout(() => {
            resolve('secondApiCall success');
        }, 3);
    });
};

const functionToTest = () => {
    setTimeout(() => {
        firstApiCall().then(result => {
                setTimeout(() => {
                    secondApiCall()
                }, 2)
            })
    }, 15)
};

基本上生成模拟的代码就是这样的,所以最后你有同步代码

const firstApiCall = () => {
    return {
        then: (cb) => {
            cb('firstApiCall success')
        }
    }
};

非常感谢!

2 个答案:

答案 0 :(得分:0)

除非返回Promise,否则无法检查第二次API调用是否直接发生。

如下所述:

const functionToTest = () => {
  setTimeout(() => {
    firstApiCall().then(result => {
      setTimeout(() => {
        secondApiCall()
      }, 2)
    })
  }, 15)
};

承诺不归还,所以你无能为力恕我直言。

在这里嘲笑这个功能我没用。

如果你不能直接测试它,你可以尝试间接测试它:即使它非常糟糕,你可以通过函数调用的API检查,API背后的资源状态已经改变如第二次通话后的预期。 如果你不能通过API进行测试......那么就没有什么可以测试的了。

答案 1 :(得分:0)

在尝试了几件事之后,您可以随时执行的操作是模拟第一个API调用,因此在结束而不是异步调用时,您将拥有同步一个感谢回调,我将留下一个例子,为那些在测试未返回的承诺时需要灵感的人。

const firstApiCall = () => {
    return {
        then: (callback) => {
            callback('firstApiCall success');
        }
    }
};
PS:再一次,这个解决方案不是最漂亮的,但至少可以起作用。