Я пишу функцию Azure и сохраняю данные в CosmosDB. Это работает так:
const preloadShipmentTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
if (req.body) {
const body: Body = req.body
context.bindings.cosmosDocument = JSON.stringify(body);
context.res = {
status: 200,
body: 'Successfully persisted document'
};
}
}
И вот тест для той же функциональности:
test('returns 200', async () => {
let contextMock: Context = mock<Context>()
const body = createBody()
const request = {
body: body
}
let context = instance(contextMock)
context.bindings = {
cosmosDocument: undefined
}
await httpFunction(context, request)
verify(contextMock.log(`log`)).once()
expect(context.bindings.cosmosDocument).toBeDefined()
expect(context.bindings.cosmosDocument).toEqual(JSON.stringify(body))
expect(context.res).toBeDefined()
expect(context.res!.status).toBe(200)
expect(context.res!.body).toBe('Successfully persisted document')
})
Привязки в объекте Context
выглядят так в определении:
/**
* Input and trigger binding data, as defined in function.json. Properties on this object are dynamically
* generated and named based off of the "name" property in function.json.
*/
bindings: {
[key: string]: any;
};
Я использую для этого ts-mockito.
Теперь я хотел бы проверить, что происходит при неудачном назначении объекта, например, при записи в базу данных происходит сбой:
when(context.bindings.cosmosDocument).thenThrow(new Error(''))
Очевидно, что это не сработает, поскольку cosmosDocument не является ложным:
TypeError: this.methodToStub не является функцией
Как я могу сделать это в TypeScript? Это простой вопрос, чтобы изменить мой код, или мне нужно погрузиться в механику Azure Framework функции?