Javascript Jest:测试函数时的逻辑问题

Javascript Jest:测试函数时的逻辑问题,javascript,typescript,testing,jestjs,Javascript,Typescript,Testing,Jestjs,我想测试一个名为getRunningContainers的函数,它基本上返回系统上所有正在运行的容器。它在内部使用了两个函数,分别称为listContainers和getContainer async getRunningContainers(): Promise<ContainerInspectInfo[] | undefined> { const runningContainers: ContainerInspectInfo[] = []; const opt

我想测试一个名为getRunningContainers的函数,它基本上返回系统上所有正在运行的容器。它在内部使用了两个函数,分别称为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;
    }
  }
我不确定是否需要更多的信息,所以如果需要,请随时告诉我。谢谢

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;
  }
}
导入{
容器作为容器接口,
ContainerCreateOptions,
集装箱信息,
ContainerInspectInfo,
主机配置,
}来自“dockerode”;
出口类集装箱{
客户:任何;
建造商(客户:任何){
this.client=client;
}
异步创建(
选择:任何
):承诺{
let容器:容器接口;
const{name,Image,Cmd,HostConfig,Labels,Entrypoint,Env}=opts;
试一试{
const createOpts:ContainerCreateOptions={
名称
形象,,
Cmd,
主机配置,
标签,
入口点,
环境,
};
container=等待this.client.createContainer(createOpts);
返回容器;
}捕捉(错误){
log(`create container error:${err}`);
返回;
}
}
异步getRunningContainers():承诺{
const runningContainers:ContainerInspectInfo[]=[];
常量选项:任意={
过滤器:{
状态:[“正在运行”],
},
};
试一试{
const containers:ContainerInfo[]=等待this.client.listContainers(
选择
);
用于(容器的常数c){
const container:ContainerInterface=等待this.client.getContainer(
c、 身份证
);
const containerInspect:ContainerInspectInfo=wait container.inspect();
运行容器。推送(容器检查);
}
返回运行容器;
}捕捉(错误){
log(`running containers error:${err}`);
返回;
}
}
静态newContainerConfig(
旧容器:ContainerInspectInfo,
newImage:string
):ContainerCreateOptions{
常量配置:ContainerCreateOptions={
名称:oldContainer['name'].替换('/',''),
图片:新图片,
Cmd:oldContainer['Config']['Cmd'],
HostConfig:oldContainer['HostConfig'],
标签:oldContainer['Config']['Labels'],
入口点:旧容器['Config']['Entrypoint'],
Env:oldContainer['Config']['Env'],
};
返回配置;
}
}

由于您的
虚拟容器是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()需要是一个基于异步/承诺的函数,它将返回您期望的结果。我假设这是您容器的JSON,但这可能是错误的。

容器类中有什么?您是否看到`console.log(
运行容器错误:${err}
);`在控制台中被触发?不,我没有看到任何控制台。日志触发和容器类表示类似的东西是的-如果不查看容器的代码,就看不到任何问题。您可以尝试从getRunningContainers中的catch块返回一个不同的值,即123,以排除这是返回点-可能只是日志没有出现。我在问题中添加了container.ts。

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

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