在本例中,我们的目标是编写一个测试函数GetNamespaceCreationTime 函数,用于检索特定 Kubernetes 命名空间的创建时间戳。但是,您很难找到合适的方法来合并初始化逻辑并与假客户端交互。
为了有效测试 GetNamespaceCreationTime 函数,初始化过程不应驻留在函数本身。相反,Kubernetes 客户端接口应作为参数传递给该函数。
将 GetNamespaceCreationTime 函数中的现有代码替换为以下内容:
<code class="go">import ( "fmt" "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "time" ) 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() }</code>
接下来,定义一个函数来获取客户端设置:
<code class="go">func GetClientSet() kubernetes.Interface { config, err := rest.InClusterConfig() if err != nil { log.Warnf("Could not get in-cluster config: %s", err) return nil, err } client, err := kubernetes.NewForConfig(config) if err != nil { log.Warnf("Could not connect to in-cluster API server: %s", err) return nil, err } return client, err }</code>
在 TestGetNamespaceCreationTime 函数中,实例化假客户端并调用 GetNamespaceCreationTIme 方法:
<code class="go">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) } }</code>
此测试确保使用假客户端准确检索“默认”命名空间的预期创建时间戳。
考虑引入模拟函数来增强代码的可测试性和灵活性,例如:
<code class="go">func fakeGetInclusterConfig() (*rest.Config, error) { return nil, nil } func fakeGetInclusterConfigWithError() (*rest.Config, error) { return nil, errors.New("fake error getting in-cluster config") }</code>
这些方法允许更强大的测试场景,您可以在其中断言成功和失败的集群内配置检索的行为。
以上是如何使用假客户端为 Client-Go 创建简单的测试?的详细内容。更多信息请关注PHP中文网其他相关文章!