Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何测试对异步非等待函数的调用_Javascript_Node.js_Unit Testing_Asynchronous_Jestjs - Fatal编程技术网

Javascript 如何测试对异步非等待函数的调用

Javascript 如何测试对异步非等待函数的调用,javascript,node.js,unit-testing,asynchronous,jestjs,Javascript,Node.js,Unit Testing,Asynchronous,Jestjs,我想测试注入传递的fuctionUT和内部asyncunwaited函数externalCall的执行情况。以下代码是my函数及其用法的简单工作示例: const sleep=async(ms)=>newpromise((accept)=>setTimeout(()=>accept(),ms)) const callToExternaService=async()=>sleep(1000) const backgroundJob=async(externalCall)=>{ 等待睡眠(500)/

我想测试注入传递的
fuctionUT
和内部
async
unwaited函数
externalCall
的执行情况。以下代码是my函数及其用法的简单工作示例:

const sleep=async(ms)=>newpromise((accept)=>setTimeout(()=>accept(),ms))
const callToExternaService=async()=>sleep(1000)
const backgroundJob=async(externalCall)=>{
等待睡眠(500)//模拟应用程序内工作
wait externalCall()//模拟外部调用
console.log('bk作业完成')
返回“工作完成”
}
常量appDeps={
外部服务:CallToExternalService
}
常量函数ut=async(deps)=>{
等待睡眠(30)//模拟func工作
//wait backgroundJob(deps.externalService)//这会使测试工作,但会减慢函数的执行
backgroundJob(deps.externalService)//我不想等待性能原因
.然后(()=>console.log('bk job ok'))
.catch(()=>console.log('bk作业错误'))
返回“完成”
}
functionUT(appDeps)
.然后((结果)=>console.log(结果))
.catch(err=>console.log(err))
module.exports={
函数
}
这里有一个简单的jest测试用例失败,但只是因为时间原因:

const{functionUT}=require('./index')
描述('测试',()=>{
它('should pass',async()=>{
const externaServiceMock=jest.fn()
常数fakeDeps={
externalService:ExternalServiceMock
}
常量结果=等待函数ut(fakeDeps)
期望(结果)。待完成('done'))
expect(externaServiceMock).toBeCalledTimes(1)//此处失败,但只是因为时间原因
})
})
在不降低
函数ut
性能的情况下,测试调用
外部服务锁(通过测试)的正确方法是什么

我已经发现了类似的请求,但它们只威胁到问题的简化版本


您无法测试调用外部服务的
调用是否被称为“somewhen later”


但是,您可以单独模拟
backgroundJob
并测试使用预期参数调用的对象(在
functionUT
完成之前),以及单元测试
backgroundJob

您无法测试
callToExternaService
是否确实被称为“稍后某个时候”


但是,您可以单独模拟
backgroundJob
和测试(在
functionUT
完成之前)调用的预期参数,以及单元测试
backgroundJob

如果存在承诺,但无法在依赖其解决方案的地方实现,则这是一个潜在的设计问题。对导入执行异步副作用的模块是另一个问题。这两个问题都会影响可测试性,如果应用程序的工作方式发生变化,它们也会影响应用程序

考虑到有一个承诺,你可以选择在特定的地方链接或不链接它。这并不意味着它应该扔掉。在这种特定的情况下,它可能是从一个没有链接它的函数返回的

一种常见的方法是在每一点上保留承诺,以备以后需要,至少是为了测试目的,但可能是为了干净的关机、扩展等

const functionUT = async (deps) => {
  await sleep(30) // Simulate func work
  return {
    status: 'done',
    backgroundJob: backgroundJob(deps.externalService)...
  };
}

const initialization = functionUT( appDeps )...

module.exports = {
  functionUT,
  initialization 
}
在这种形式下,它应该进行如下测试:

beforeAll(async () => {
  let result = await initialization;
  await result.backgroundJob;
});

...

  let result = await functionUT(fakeDeps);
  expect(result.status).toBe('done')
  await result.backgroundJob;
  expect(externaServiceMock).toBeCalledTimes(1);
如果测试套件足够短,不等待
初始化
可能会导致打开处理程序,并导致Jest发出合理的警告

通过在正确的位置使用玩笑假计时器以及
刷新承诺
,可以加快测试速度


functionUT(appDeps)
可以从模块中提取调用,以仅在需要的地方(例如入口点)产生副作用。这样它就不会干扰使用该模块的其余测试。另外,至少可以将一些函数提取到它们自己的模块中,使其具有可模拟性,并提高可测试性(
backgroundJob
,另一个答案是)因为在同一模块中声明它们时,它们不能单独模拟。

如果承诺存在,但无法在依赖其解决的地方达成,这是一个潜在的设计问题。对导入执行异步副作用的模块是另一个问题。这两个问题都会影响可测试性,如果应用程序的工作方式发生变化,它们也会影响应用程序

考虑到有一个承诺,你可以选择在特定的地方链接或不链接它。这并不意味着它应该扔掉。在这种特定的情况下,它可能是从一个没有链接它的函数返回的

一种常见的方法是在每一点上保留承诺,以备以后需要,至少是为了测试目的,但可能是为了干净的关机、扩展等

const functionUT = async (deps) => {
  await sleep(30) // Simulate func work
  return {
    status: 'done',
    backgroundJob: backgroundJob(deps.externalService)...
  };
}

const initialization = functionUT( appDeps )...

module.exports = {
  functionUT,
  initialization 
}
在这种形式下,它应该进行如下测试:

beforeAll(async () => {
  let result = await initialization;
  await result.backgroundJob;
});

...

  let result = await functionUT(fakeDeps);
  expect(result.status).toBe('done')
  await result.backgroundJob;
  expect(externaServiceMock).toBeCalledTimes(1);
如果测试套件足够短,不等待
初始化
可能会导致打开处理程序,并导致Jest发出合理的警告

通过在正确的位置使用玩笑假计时器以及
刷新承诺
,可以加快测试速度


functionUT(appDeps)
可以从模块中提取调用,以仅在需要的地方(例如入口点)产生副作用。这样它就不会干扰使用该模块的其余测试。另外,至少有些函数可以被提取到它们自己的模块中以进行模拟,并提高可测试性(
backgroundJob
,正如另一个答案所建议的那样),因为当它们在同一个模块中以这种方式声明时,不能单独模拟它们。

对不起,没有阅读您的整个问题。尝试添加一个1ms的超时或其他时间,以便代码有时间运行。您可以使用Jest伪计时器和刷新承诺来测试它。但真正的问题是功能,它是脆弱的。它是
async
,但没有
wait
。我在这里看不到性能原因。哟