我想模擬來自 Python Kubernetes 客戶端的回應。下面是我的 Kubernetes 服務的代碼:
import os
from kubernetes.client.rest import ApiException
from kubernetes import client
from kubernetes.config import load_config
from exceptions.logs_not_found_exceptions import LogsNotFound
import logging
log = logging.getLogger("services/kubernetes_service.py")
class KubernetesService:
def __init__(self):
super().__init__()
if os.getenv("DISABLE_KUBERNETES_CONFIG") == "False":
load_config()
self.api_instance = client.CoreV1Api()
def get_namespaces(self):
try:
api_response = self.api_instance.list_namespace()
dict_response = api_response.to_dict()
namespaces = []
for item in dict_response['items']:
namespaces.append(item['metadata']['name'])
log.info(f"Retrieved the namespaces: {namespaces}")
return namespaces
except ApiException as e:
raise e
當我想使用 mock.patch 對此進行模擬時,我收到了 ModuleNotFoundError。下面是我的測驗類的代碼
import os
from unittest import mock
from tests.unit_tests import utils
from services.kubernetes_service import KubernetesService
class TestKubernetesService:
@mock.patch.dict(os.environ, {"DISABLE_KUBERNETES_CONFIG": "True"})
def test_get_namespaces(self):
self.service = KubernetesService()
print(self.service.api_instance)
with mock.patch('services.kubernetes_service.KubernetesService.api_instance.list_namespace',
return_value=utils.kubernetes_namespaces_response()):
actual_result = self.service.get_namespaces()
assert actual_result == ['default', 'kube-node-lease', 'kube-public', 'kube-system']
當我編輯mock.patchfrom 中的路徑時services.kubernetes_service.KubernetesService.api_instance.list_namespace,services.kubernetes_service.KubernetesService.get_namespaces它成功模擬了我輸入的回傳值。但我想模擬self.api_instance.list_namespace()KubernetesService 類中該行的回應。
有人有想法嗎?
uj5u.com熱心網友回復:
在您的示例中,您嘗試修補類 ( api_instance)的實體屬性。這不能通過僅從類中參考它來完成,因為它不是類屬性 - 您需要一個實體。
通常有兩種標準方法來模擬實體屬性:
- 模擬整個類,在這種情況下,
return_value被模擬類上的屬性將是一個替代類的任何實體的模擬,因此可用于模擬實體屬性 - 使用mock.patch.object或類似方法模擬具體實體- 這要求您有權訪問測驗中的實體
在您的情況下,模擬整個類不是一個選項,因為您需要使用類的功能,但是由于您可以通過 訪問實體self.service,您可以使用patch.object:
def test_get_namespaces(self):
self.service = KubernetesService()
with mock.patch.object(self.service.api_instance, 'list_namespace',
return_value=utils.kubernetes_namespaces_response()):
actual_result = self.service.get_namespaces()
assert actual_result == ['default', 'kube-node-lease', 'kube-public', 'kube-system']
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364288.html
