如何解开玩笑扩展对象?

时间:2020-07-11 00:25:08

标签: javascript typescript unit-testing mocking jestjs

我目前正在为单元测试模拟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],
        },
      }

0 个答案:

没有答案