繁体   English   中英

如何测试被测函数未返回的被称为promise

[英]How to test called promises not returned in tested function

首先,我一直在尝试使该代码正常工作的所有方法,但我实现了,问题是我不喜欢这种方法,并且我想知道是否有可以做的更好的方法TEST代码更具可读性,但功能强大。

我想断言 (与sinon为例),第二功能( secondApiCall )被调用 ,但似乎没有办法做到这一点,你将如何做到这一点。 是否有非骇人听闻的方法?

这里的主要问题是“我无法修改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')
        }
    }
};

非常感谢你!

您不能检查第二个API调用是否确实直接发生,除非返回了Promise。

如此处所述:

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

Promise不会退还,所以恕我直言,您对此无能为力。

我要说的是模拟功能。

如果您不能直接对其进行测试,则可以尝试进行间接测试:即使它非常糟糕,您也可以通过API来检查该函数正在调用,该API背后的资源状态在第二次调用之后已按预期进行了更改。 如果您不能很好地通过API进行测试...那么就没什么要测试的了。

在尝试了几件事之后,您始终可以做的是模拟第一个API调用,因此最后,由于有了回调,您将获得一个同步,而不是一个异步调用,这里我给大家留下一个例子,当测试未返回的承诺时。

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

PS:同样,此解决方案不是最漂亮,但至少可以起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM