В настоящее время я издеваюсь над 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],
},
}