使用client-go的fake客户端Mock错误不生效该如何解决?
问题原因
- 核心错误是Fake客户端的Reactor匹配规则写错了:Kubernetes REST API中Secret对应的资源名称是小写复数形式
secrets,你测试代码里填的是单数secret,导致你定义的Reactor根本匹配不到业务代码里发起的Secret列表请求,自然不会返回预期错误。 - 额外需要确认
getKubeClient()返回的确实是client-go自带的fake clientset实例,而非真实集群客户端。
修正方案
仅需要修改测试代码中PrependReactor的第二个参数为secrets即可,修正后的测试代码如下:
func TestWhenItsNotPossibleToFetchTheSecrets_ThenAnErrorIsReturned(t *testing.T) { kubeClient := getKubeClient() kubeClient.CoreV1().(*fakecorev1.FakeCoreV1). // 把第二个参数从"secret"改为"secrets" PrependReactor("list", "secrets", func(action testingk8s.Action) (handled bool, ret runtime.Object, err error) { return true, &v1.SecretList{}, errors.New("error listing secrets") }) r := getRefresher(kubeClient) err, warnings := r.RefreshNamespace(context.Background(), "target-ns") require.Error(t, err, "an error should have been raised") }
额外说明
如果后续遇到其他资源的Reactor匹配失效问题,可以直接查Kubernetes API文档确认对应资源的REST路径名称,所有核心资源的Reactor匹配名都使用小写复数形式即可。
内容的提问来源于stack exchange,提问作者beni0888
相关产品推荐
相关产品推荐

