Назначение объекта тестирования в TypeScript - PullRequest
0 голосов
/ 20 апреля 2020

Я пишу функцию 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 функции?

1 Ответ

2 голосов
/ 20 апреля 2020

Если вы хотите выдать ошибку в назначении:

context.bindings.cosmosDocument = JSON.stringify(body);

, у вас есть два варианта:

  1. Оставьте context.bindings как undefined, что приведет к TypeError: Cannot set property 'cosmosDocument' of undefined; или

  2. Реализация set аксессора , который выдает ошибку по вашему выбору:

    context.bindings = {
      set cosmosDocument(document: string) {
        throw new Error("");
      },
    };
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...