如何使用假客户端为 client-go 编写简单的测试?

2023-12-13

Problem

我正在寻找正确的方法来测试下面的代码,我找不到任何示例如何做到这一点。仅有的main_test.go但它缺少 main.go,对我来说,如何使用它并不明显。 我也浏览过Githubissues但我找不到任何有用的东西。

功能:

import (
  "fmt"
  "k8s.io/api/core/v1"
  metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  fake "k8s.io/client-go/kubernetes/fake"
  "time"
)

func GetNamespaceCreationTime(namespace string) int64 {
    config, err := rest.InClusterConfig()
    if err != nil {
        panic(err.Error())
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    ns, err := clientset.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("%v \n", ns.CreationTimestamp)
    return (ns.GetCreationTimestamp().Unix())
}

Test:

我认为我的测试应该如下所示,但是我该如何使用config := fake.NewSimpleClientset(),我应该把它传递给GetNamespaceCreationTime功能?

func TestGetNamespaceCreationTime(t *testing.T) {
  config := fake.NewSimpleClientset()
  got := GetNamespaceCreationTime("default")
  want := int64(1257894000)

  nsMock := config.CoreV1().Namespaces()
  nsMock.Create(&v1.Namespace{
    ObjectMeta: metav1.ObjectMeta{
      Name:              "default",
      CreationTimestamp: metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
    },
  })

  if got != want {
    t.Errorf("got %q want %q", got, want)
  }

您需要将初始化部分移到 GetNamespaceCreationTime 函数之外。您可以将 kubernetes.Interface 作为参数传递给该函数。

    import (
      "fmt"
      "k8s.io/api/core/v1"
      metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
      fake "k8s.io/client-go/kubernetes/fake"
      "k8s.io/client-go/kubernetes"
      "time"
    )

var getInclusterConfigFunc = rest.InClusterConfig
var getNewKubeClientFunc = dynamic.NewForConfig
   
    
    func GetNamespaceCreationTime(kubeClient kubernetes.Interface, namespace string) int64 {
    
        ns, err := kubeClient.CoreV1().Namespaces().Get(namespace, metav1.GetOptions{})
        if err != nil {
            panic(err.Error())
        }
        fmt.Printf("%v \n", ns.CreationTimestamp)
        return (ns.GetCreationTimestamp().Unix())
    }
    
    func GetClientSet() kubernetes.Interface {
      config, err := getInclusterConfigFunc()
      if err != nil {
        log.Warnf("Could not get in-cluster config: %s", err)
        return nil, err
      }

      client, err := getNewKubeClientFunc(config)
      if err != nil {
        log.Warnf("Could not connect to in-cluster API server: %s", err)
        return nil, err
      }

      return client, err
    }

然后您的测试函数可以实例化假客户端并调用该方法。

    func TestGetNamespaceCreationTime(t *testing.T) {
      kubeClient := fake.NewSimpleClientset()
      got := GetNamespaceCreationTime(kubeClient, "default")
      want := int64(1257894000)
    
      nsMock := config.CoreV1().Namespaces()
      nsMock.Create(&v1.Namespace{
        ObjectMeta: metav1.ObjectMeta{
          Name:              "default",
          CreationTimestamp: metav1.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC),
        },
      })
    
      if got != want {
        t.Errorf("got %q want %q", got, want)
      }

func fakeGetInclusterConfig() (*rest.Config, error) {
    return nil, nil
}

func fakeGetInclusterConfigWithError() (*rest.Config, error) {
    return nil, errors.New("fake error getting in-cluster config")
}

func TestGetInclusterKubeClient(t *testing.T) {
    origGetInclusterConfig := getInclusterConfigFunc
    getInclusterConfigFunc = fakeGetInclusterConfig
    origGetNewKubeClient := getNewKubeClientFunc
    getNewKubeClientFunc = fakeGetNewKubeClient

    defer func() {
        getInclusterConfigFunc = origGetInclusterConfig
        getNewKubeClientFunc = origGetNewKubeClient
    }()

    client, err := GetClientSet()
    assert.Nil(t, client, "Client is not nil")
    assert.Nil(t, err, "error is not nil")
}

func TestGetInclusterKubeClient_ConfigError(t *testing.T) {
    origGetInclusterConfig := getInclusterConfigFunc
    getInclusterConfigFunc = fakeGetInclusterConfigWithError

    defer func() {
        getInclusterConfigFunc = origGetInclusterConfig
    }()

    client, err := GetInclusterKubeClient()
    assert.Nil(t, client, "Client is not nil")
    assert.NotNil(t, err, "error is nil")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用假客户端为 client-go 编写简单的测试? 的相关文章

  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 如何从 JWT 令牌中提取声明

    我正在使用 dgrijalva jwt go 包 我想从令牌中提取有效负载 但找不到方法 示例 取自 https jwt io https jwt io 对于编码 eyJhbGciOiJIUZI1NiIsInR5cCI6IkpXVCJ9 e
  • 如何修复“缺少表的 FROM 子句条目”错误

    我正在尝试根据游戏 ID 获取平台名称 我有如下三个表 我正在尝试加入它们以获得所需的结果 Games Id 1 2 3 4 Game Platforms Id game id platform id 1 1 1 2 1 2 3 3 3
  • 如何将接口转换为接口切片?

    我的输入是interface 而且我知道它可以是任何类型的数组 我想读取我输入的元素之一 所以我尝试将我的interface 进入一个 interface 但是 go 会给我以下错误 恐慌 接口转换 interface 是 map stri
  • Golang 中的确定性 RSA 加密 - 如何在多次加密下为给定消息获得相同的结果

    对于下面的RSA加密代码 每次对同一条消息进行加密时 结果都会不同 我发现这是由于rand Reader in the rsa EncryptOAEP功能使其更加安全doc https pkg go dev crypto rsa Encry
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • Facebook服务器端登录、CORS

    我正在实现一个带有 FB 服务器端登录的网站 简化步骤如下 一个简单的按钮触发 JS 脚本 该脚本调用我的后端 APIhttps localhost fblogin function sendFbLoginData get https lo
  • 有没有办法从另一个包访问结构体的私有字段?

    我在一个包中有一个具有私有字段的结构 package foo type Foo struct x int y Foo 另一个包 例如 白盒测试包 需要访问它们 package bar import foo func change foo f
  • 使用泛型:类型参数 T 不能与 == 进行比较

    我正在操场上玩 Go Generics 尝试编写一些通用数组函数 https gotipplay golang org p vS7f Vxxy2j https gotipplay golang org p vS7f Vxxy2j packa
  • 测试 gRPC 服务

    我想测试用 Go 编写的 gRPC 服务 我使用的示例是 Hello World 服务器示例grpc go 仓库 https github com grpc grpc go blob master examples helloworld g
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 子字符串和 Go 垃圾收集器

    在 Go 中获取字符串的子字符串时 不会分配新的内存 相反 子字符串的底层表示包含一个数据指针 该指针是原始字符串的数据指针的偏移量 这意味着 如果我有一个大字符串并希望跟踪一个小子字符串 则垃圾收集器将无法释放任何大字符串 直到我释放对较

随机推荐

  • Python正则表达式提取日期

    我的字符串看起来像这样 server date YYYYMMDD int server date MON DAY YYYY int 还有更多 不同的日期格式 此外 可以有任意数量的 块 并且它们可以以任意顺序出现 我试图获取 Python
  • 如何通过 Docusign API 将动态图像添加到 Docusign 文档

    我不知道 Docusign API 是否可以实现这一点 但我很好奇是否可以将动态图像添加到模板文档中 此动态图像的目的是根据发送者的身份为文档设置徽标 我知道 Docusign 有品牌 但我们希望此图像位于模板文档的特定位置 如果有人知道这
  • 1 到 100 之间的正则表达式编号

    我搜索了很多 找不到这个 RegExp 的解决方案 我不得不说我在 Reg Expressions 方面不是很有经验 Regex 1 9 0 9 1 100 我想测试一个数字1 到 100 之间 不包括 0 Try 1 9 0 9 100
  • 参数类型可能存在的时间不够长

    我有一个简单的程序 我试图实现多态帐户类型 enum AccountType INVALID TYPE1 TYPE2 trait Account fn get name self gt String fn get type self gt
  • JToken.WriteToAsync 不写入 JsonWriter

    我正在尝试创建一个以某种方式更改请求的中间件 我能够阅读它并更改内容 但我无法弄清楚如何正确设置流编写器来创建新的正文 当我打电话时normalized WriteToAsync jsonWriter the MemoryStream仍然是
  • VS2017 和 VS2015 应用程序与 dll 之间的官方二进制不兼容性是否准确?

    TL DR MS 文档指出 VS2015 和 VS2017 库之间的二进制兼容性是one way 虽然我认为这必然是双向的 问题在哪里 首先 背景 任何 MSVC 构建的库都是正式二进制兼容VS2015 和 VS2017 之间 具体来说 您
  • sqldf、csv 和包含逗号的字段

    我花了一段时间才弄清楚这一点 我也是回答我自己的问题 您有一些 csv 您想要加载它fast 你想使用sqldf包裹 您常用的代码会被一些烦人的字段所困扰 例子 1001 Amy 9 43 00 99 2 1002 Ben Jr 9 43
  • HTTPS URL 是否加密?

    使用 TLS SSL HTTPS 加密时是否所有 URL 均已加密 我想知道 因为我希望在使用 TLS SSL HTTPS 时隐藏所有 URL 数据 如果 TLS SSL 为您提供全面的 URL 加密 那么我就不必担心隐藏 URL 中的机密
  • 为什么我的 WCF 服务不使用我的实体模型?

    我在同时使用 WCF 服务和实体模型时遇到问题 我已经从现有数据库创建了一个实体模型 这可以如下所示 在来自 实体对象代码生成器 的任何控制台应用程序中使用我的类时没有任何问题 然后 我创建了 WCF 服务 其接口如下 ServiceCon
  • python 正则表达式包含缺少的逗号

    我需要确保字符串具有逗号分隔的值 我读取的字符串可能有空格分隔的值 我的输入字符串中可能缺少一些逗号 也就是说 如果存在任何空格分隔的值而没有逗号 我必须包含一个逗号 我不应该对单引号或双引号内的字符串进行任何更改 这些带引号的值可以包含除
  • 如何以编程方式快速调用 UIView 上的手势点击

    我有一个 UIView 并且我向它添加了点击手势 let tap UITapGestureRecognizer target self action Selector handleTap tap delegate self myView a
  • 在 IAsyncResult 中使用异步方法

    我正在实施令牌提供者班级来自Microsoft ServiceBus命名空间 我正在重写以下方法 protected override IAsyncResult OnBeginGetToken string appliesTo string
  • 使用 C 语言的 NXP Mifare Ultralight 从 NFC 腕带读取正确的数据

    我对 NFC 设备读取非常陌生 但我已经设法使用以下代码在我自己的项目中实现NFC mfultralight c libnfc 我不明白的是 当我从 MIFARE Ultralight 手环读取数据时 我得到了很多垃圾 例如 我的标签中有数
  • 如何将类的每个实例与另一个类的每个实例关联起来?

    一般问题 我正在研究一个简单的本体 使用 Prot g 4 3 并尝试创建一个模型 以便类的每个实例C有一些特殊的价值v 这是一个类的实例V 对于给定的属性p 我可以使用公理得到这个推论 C 子类 p value v 但我想我希望能够更进一
  • Java javax.swing.Timer - 冻结我的 GUI。解决方案?

    我有一个使用 javax swing Timer 运行的任务 它每隔几分钟执行一次 该任务需要一两秒钟 并且它冻结了我的 GUI 我可以做什么来解决这个问题 计时器任务在事件调度线程上执行 因此当您的任务运行时 不会发生其他 Swing 事
  • 如何在 Swift 中过滤 NSArray?

    self filteredUserData self userData filter listing NSDictionary gt Bool in let stringMatch listing name rangeOfString se
  • 对方案中的列表进行排序

    我想创建对列表进行排序的函数 例如我有这个列表 x1 x2 x3 xn or 1 2 3 4 5 6 我想按以下顺序显示数字 x1 xn x2 xn 1 or 1 6 2 5 3 4 你能帮我写这个例子吗 通常 当我们谈论排序时 我们指的是
  • Internet Explorer 8 和复选框 CSS 问题

    目前 我遇到了 Internet Explorer 8 忽略列表中包含复选框的填充 行高的问题 首先是我的 CSS 和 XHTML 标记here 问题发生在列表元素上 其中包括Private 目前 Firefox 3 Internet Ex
  • 向 WooCommerce 中的特定支付网关添加自定义百分比费用和固定成本

    在 WooCommerce 中 我需要为特定支付网关申请自定义手续费 按百分比成本收取的自定义手续费和按固定成本收取的自定义手续费 我有这个2 pieces代码 A 百分比成本 函数 PERCENTACE COST Add a custom
  • 如何使用假客户端为 client-go 编写简单的测试?

    Problem 我正在寻找正确的方法来测试下面的代码 我找不到任何示例如何做到这一点 仅有的main test go但它缺少 main go 对我来说 如何使用它并不明显 我也浏览过Githubissues但我找不到任何有用的东西 功能 i