Javascript 在TypeScript中测试对象分配

Javascript 在TypeScript中测试对象分配,javascript,typescript,unit-testing,azure-functions,Javascript,Typescript,Unit Testing,Azure Functions,我正在编写Azure函数并将数据持久化到CosmosDB。 它的工作原理如下: const preloshipmenttrigger:AzureFunction=async函数(context:context,req:HttpRequest):承诺{ 如果(请求正文){ const body:body=req.body context.bindings.cosmosDocument=JSON.stringify(body); context.res={ 现状:200, 正文:“已成功持久化文档”

我正在编写Azure函数并将数据持久化到CosmosDB。 它的工作原理如下:

const preloshipmenttrigger:AzureFunction=async函数(context:context,req:HttpRequest):承诺{
如果(请求正文){
const body:body=req.body
context.bindings.cosmosDocument=JSON.stringify(body);
context.res={
现状:200,
正文:“已成功持久化文档”
};
}
}
下面是对相同功能的测试:

test('returns 200',async()=>{
让contextMock:Context=mock()
const body=createBody()
常量请求={
身体:身体
}
let context=instance(contextMock)
context.bindings={
宇宙文档:未定义
}
等待httpFunction(上下文、请求)
验证(contextMock.log(`log`)).once()
expect(context.bindings.cosmosDocument).tobededefined()
expect(context.bindings.cosmosDocument).toEqual(JSON.stringify(body))
expect(context.res).toBeDefined()
expect(context.res!.status).toBe(200)
expect(context.res!.body).toBe('Successfully persistend document')
})
上下文
对象中的绑定在定义中如下所示:

/**
*输入和触发绑定数据,如function.json中所定义。此对象上的属性是动态的
*根据function.json中的“name”属性生成和命名。
*/
绑定:{
[键:字符串]:任意;
};
我用ts mockito来做这个

现在,我想测试当对象分配失败时会发生什么,例如写入数据库失败:

when(context.bindings.cosmosDocument).然后抛出(新错误(“”))
显然,这是行不通的,因为cosmosDocument不是一个模拟文件:

TypeError:this.methodToStub不是函数


如何在TypeScript中执行此操作?重新排列代码是一件简单的事情,还是我必须深入研究Azure功能框架的机制?

如果您想在分配中抛出错误:

context.bindings.cosmosDocument = JSON.stringify(body);
您有两个选择:

  • 上下文.绑定
    保留为
    未定义
    ,这将导致
    类型错误:无法设置未定义
    的属性“cosmosDocument”;或

  • 实现一个抛出您选择的错误的:

    context.bindings = {
      set cosmosDocument(document: string) {
        throw new Error("");
      },
    };
    

  • 如果要在分配上引发错误:

    context.bindings.cosmosDocument = JSON.stringify(body);
    
    您有两个选择:

  • 上下文.绑定
    保留为
    未定义
    ,这将导致
    类型错误:无法设置未定义
    的属性“cosmosDocument”;或

  • 实现一个抛出您选择的错误的:

    context.bindings = {
      set cosmosDocument(document: string) {
        throw new Error("");
      },
    };
    

  • 它不是一个函数,您可以将其设置为未定义。如果将其设置为函数会发生什么?@jornsharpe我尝试将其设置为模拟以验证:
    cosmosDocument:mock()
    ,然后
    验证(context.bindings.cosmosDocument()).once()
    。但是,如果
    TypeError:context.bindings.cosmosDocument不是函数,则此操作将失败。我从不把它叫做函数,只是给它赋值。这真的有用吗?我的函数在运行时不会被覆盖吗?当我运行它时,
    cosmosDocument
    只是一个json字符串。哦,我明白了。想必这是通过感谢线索实现的,似乎是合理的。“我会调查我是否能发现一个二传手。”乔尔沙普非常感谢,这就成功了。我用解决问题的片段更新了我的问题。如果你写一个答案,我会把它标记为解决方案。它不是一个函数,你把它设置为未定义。如果将其设置为函数会发生什么?@jornsharpe我尝试将其设置为模拟以验证:
    cosmosDocument:mock()
    ,然后
    验证(context.bindings.cosmosDocument()).once()
    。但是,如果
    TypeError:context.bindings.cosmosDocument不是函数,则此操作将失败。我从不把它叫做函数,只是给它赋值。这真的有用吗?我的函数在运行时不会被覆盖吗?当我运行它时,
    cosmosDocument
    只是一个json字符串。哦,我明白了。想必这是通过感谢线索实现的,似乎是合理的。“我会调查我是否能发现一个二传手。”乔尔沙普非常感谢,这就成功了。我用解决问题的片段更新了我的问题。如果你写一个答案,我会把它标记为解决方案。