Как разблокировать объект в jest-extended? - PullRequest
0 голосов
/ 11 июля 2020

В настоящее время я издеваюсь над Azure cosmos Container и ContainerResponse для своих модульных тестов. Я издеваюсь, используя jest-extended, https://github.com/jest-community/jest-extended. Я сравниваю ожидаемый результат с имитацией объекта результата, но я бы хотел, чтобы объект результата был реальным объектом. Если я создаю фиктивный объект ContainerResponse, у него будет много свойств, доступных только для чтения, и частных, которые я не могу установить, поэтому я пытаюсь имитировать его с помощью своей реализации, а затем разблокировать его.

Вот мой тест:

test('this should return the container from initializing the database', async () => 
{
    const containerId = "testContainer";
    const expectedResult = {container : {id: containerId} };
    const result = await initializeContainer(containerId);
    expect(result).toEqual(expectedResult);
});

Вот мой шутливый макет для CosmosClient:

export class CosmosClient 
{
    readonly endpoint: string;
    readonly key: string | undefined;
    readonly databases: Databases;
    readonly containers: Containers;

    constructor(options: CosmosClientOptions)
    {
        this.endpoint = options.endpoint;
        this.key = options.key;
        this.databases = mock<Databases>();
        this.containers = mock<Containers>();
        
        this.containers.createIfNotExists = async (containerRequest) => 
        {
            const container = mock<Container>({id: containerRequest.id});
            return mock<ContainerResponse>({container}); 
        };
        this.databases.createIfNotExists = async (dbRequest) => 
        {
            const db = mock<Database>({id: dbRequest.id, containers: this.containers });
            return mock<DatabaseResponse>({database : db});
        };
    }
}

Функция инициализации контейнера показана ниже: (Вместо этого новый CosmosClient вызывает мою ложную версию)

export async function initializeContainer(containerId: string)
{
    const { endpoint, key, databaseId } = config;
    try
    {
        const client = new CosmosClient({ endpoint ,key});
        const containerDefinition = getContainerDefinition(containerId);
        const db = await createDatabase(client, databaseId);
        const createdContainer = await createContainer(db, containerDefinition);
        return {container: createdContainer};
    }
    catch (err)
    {
        console.log(err);
        return{container: undefined};
    }
}

Вот функция createContainer, которая возвращает основной результат:

export async function createContainer(database: Database, containerDefinition: ContainerDefinition)
{
    const { container } = await database.containers.createIfNotExists(containerDefinition);
    console.log(`Created container ${container.id}`);
    return container;   
}

database.containers.createIfNotExists (containerDefinition) возвращает фиктивный контейнер в фиктивном объекте CosmosClient. В C# есть способ получить доступ к реализации фиктивных объектов с помощью mock.object. Есть ли эквивалент, расширенный шуткой? Вот результат моего модульного теста, чтобы проиллюстрировать то, о чем я говорю.

  - Expected  - 0
    + Received  + 4

      Object {
        "container": Object {
    +     "_isMockObject": true,
    +     "asymmetricMatch": [Function mockConstructor],
          "id": "testContainer",
    +     "nodeType": [Function mockConstructor],
    +     Symbol(Symbol.toStringTag): [Function mockConstructor],
        },
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...