【问题标题】:Jest: Logic issue in testing a function笑话:测试功能的逻辑问题
【发布时间】:2020-09-29 08:50:36
【问题描述】:

我想测试一个名为 getRunningContainers 的函数,它基本上返回我系统上所有正在运行的容器。它使用内部的 2 个函数 listContainers 和 getContainer 来工作。

  async getRunningContainers(): Promise<ContainerInspectInfo[] | undefined> {
    const runningContainers: ContainerInspectInfo[] = [];
    const opts: any = {
      filters: {
        status: ['running'],
      },
    };
    try {
      const containers: ContainerInfo[] = await this.client.listContainers(
        opts
      );

      for (const c of containers) {
        const container: ContainerInterface = await this.client.getContainer(
          c.Id
        );
        const containerInspect: ContainerInspectInfo = await container.inspect();
        runningContainers.push(containerInspect);
      }

      return runningContainers;
    } catch (err) {
      console.log(`running containers error: ${err}`);
      return;
    }
  }

我正在编写以下 Jest 测试,其中 dummy_container 是表示容器的对象,dummy_container_response 是相同的数组,dummy_info 是表示 ContainerInspectInfo 的对象。我从 getRunningContainer 返回 undefined,但我似乎无法弄清楚原因。

describe('Container Client', () => {
    let containerData = dummy_container_responses;
    const MockDockerClient = {
        listContainers: (opts: any) => new Promise((resolve, reject) => {
            resolve(dummy_info);
        }),

        createContainer: (opts:any) => new Promise((resolve, reject)=> {
            resolve(dummy_container);
        }),

        getContainer: (id: any) => new Promise((resolve, reject) => {
            resolve(dummy_container)
        })
    }

    const containerClient = new Container(MockDockerClient);

    test('starting a container', async() => {
        const container = await containerClient.create(dummy_container);
        const containers = await containerClient.getRunningContainers()

        expect(containers).toEqual(dummy_container)
       
        
    })
}) 

我不确定是否需要更多信息,如果需要,请随时告诉我。谢谢!

import {
  Container as ContainerInterface,
  ContainerCreateOptions,
  ContainerInfo,
  ContainerInspectInfo,
  HostConfig,
} from 'dockerode';

export class Container {
  client: any;

  constructor(client: any) {
    this.client = client;
  }

  async create(
    opts: any
  ): Promise<ContainerInterface | undefined> {
    let container: ContainerInterface;
    const { name, Image, Cmd, HostConfig, Labels, Entrypoint, Env } = opts;
    try {
      const createOpts: ContainerCreateOptions = {
        name,
        Image,
        Cmd,
        HostConfig,
        Labels,
        Entrypoint,
        Env,
      };
      container = await this.client.createContainer(createOpts);
      return container;
    } catch (err) {
      console.log(`create container error: ${err}`);
      return;
    }
  }

  async getRunningContainers(): Promise<ContainerInspectInfo[] | undefined> {
    const runningContainers: ContainerInspectInfo[] = [];
    const opts: any = {
      filters: {
        status: ['running'],
      },
    };
    try {
      const containers: ContainerInfo[] = await this.client.listContainers(
        opts
      );

      for (const c of containers) {
        const container: ContainerInterface = await this.client.getContainer(
          c.Id
        );
        const containerInspect: ContainerInspectInfo = await container.inspect();
        runningContainers.push(containerInspect);
      }

      return runningContainers;
    } catch (err) {
      console.log(`running containers error: ${err}`);
      return;
    }
  }

  static newContainerConfig(
    oldContainer: ContainerInspectInfo,
    newImage: string
  ): ContainerCreateOptions {
    const config: ContainerCreateOptions = {
      name: oldContainer['Name'].replace('/', ''),
      Image: newImage,
      Cmd: oldContainer['Config']['Cmd'],
      HostConfig: oldContainer['HostConfig'],
      Labels: oldContainer['Config']['Labels'],
      Entrypoint: oldContainer['Config']['Entrypoint'],
      Env: oldContainer['Config']['Env'],
    };
    return config;
  }
}

【问题讨论】:

  • Container 类中有什么?
  • 你看到 `console.log(running containers error: ${err});` 在控制台中被解雇了吗?
  • 不,我没有看到任何 console.log 触发和容器类代表类似 docs.docker.com/engine/api/v1.37/#operation/ContainerCreate
  • 是的 - 如果不查看 Container 的代码,就看不到任何问题。您可以尝试从 getRunningContainers 中的 catch 块返回不同的值,即 123 以排除这是返回点 - 日志可能只是没有出现。
  • 我在问题中添加了container.ts。

标签: javascript typescript testing jestjs


【解决方案1】:

由于您的 dummy_container 是 JSON - 您可能希望在 MockDockerContainer 中实现您的 getContainer 方法,如下所示:


 const MockDockerClient = {
       //  ... current implementation ...

        getContainer: (id: any) => new Promise((resolve, reject) => {
            resolve({
              inspect: () => new Promise(res => res(dummy_container)),
            });
        })
    }

这是因为您正在等待 getContainer().inspect() 的结果 - 所以 inspect() 需要是一个基于 async/promise 的函数,它返回您期望的结果。我假设这是您容器的 JSON - 但这可能是错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多