我目前正在为单元测试模拟Azure cosmos Container和ContainerResponse。我在用玩笑扩展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],
},
}