gpt4 book ai didi

python - 修补作为另一个类的属性的类实例属性

转载 作者:行者123 更新时间:2023-12-04 10:01:07 27 4
gpt4 key购买 nike

#atomlib/atomtools.py

class AtomTools:
def __init__(self):
self.atomcachehelper = None

@property
def cache(self):
if not self.atomcachehelper:
from atomlib.AtomCacheHelper import AtomCacheHelper
self.atomcachehelper = AtomCacheHelper()
return self.atomcachehelper


# wdm_oms_failures_detector.py

import pandas as pd
from atomlib.atomtools import atomtools as atom

class WdmNetworkFailureDetector(object):
def __init__(self,):
self._cache_helper = atom.cache

def update_wdm_cache_data(self) -> pd.DataFrame:
df_oms = self._cache_helper.query_to_df()
return df_oms

# conftest.py

import pytest

@pytest.fixture(scope='module')
def df_oms():
path = 'some_path.csv'
df_oms = pd.read_csv(path)
return df_oms


# test_wdm_oms_failures_detector.py

from unittest.mock import patch, PropertyMock, call
from wdm_oms_failures_detector WdmNetworkFailureDetector

wnfd = WdmNetworkFailureDetector()

class TestWdmNetworkFailureDetector(object):

def test_get_mol_objects(self):
pass

@patch('wdm_oms_failures_detector.atom.cache')
def test_update_wdm_cache_data(self, mocked_cache, df_oms):

# Setup
mocked_cache.return_value.query_to_df.return_value = df_oms
# Exercise
wnfd.update_wdm_cache_data()
# Verify
mocked_cache.return_value.query_to_df.assert_called_once()

我正在尝试修补 WdmNetworkFailureDetector 类的实例属性 atom.cache,它是 atomtools 的一个属性,它返回 AtomCacheHelper 对象。然后我想模拟 AtomCacheHelper 的 query_to_df 方法并返回 fixture 。我不知道如何正确地做到这一点,我尝试了几种方法,其中大多数都导致了相同的 AttributeErrors:
....
elif kwargs:
# can't set keyword args when we aren't creating the mock
# XXXX If new is a Mock we could call new.configure_mock(**kwargs)
raise TypeError("Can't pass kwargs to a mock we aren't creating")

new_attr = new

self.temp_original = original
self.is_local = local
> setattr(self.target, self.attribute, new_attr)
E AttributeError: can't set attribute

....
self = <unittest.mock._patch object at 0x000001E9B1618940>, exc_info = (<class 'AttributeError'>, AttributeError("can't set attribute",), <traceback object at 0x000001E9B17EEF48>)

def __exit__(self, *exc_info):
"""Undo the patch."""
if not _is_started(self):
raise RuntimeError('stop called on unstarted patcher')

if self.is_local and self.temp_original is not DEFAULT:
setattr(self.target, self.attribute, self.temp_original)
else:
> delattr(self.target, self.attribute)
E AttributeError: can't delete attribute

最佳答案

问题是你在修补之外实例化了你的测试类,所以缓存助手用真实对象初始化,稍后修补它不会改变它,因为它已经分配给变量。您必须在修补期间进行实例化:

test_wdm_oms_failures_detector.py

from unittest.mock import patch

from wdm_oms_failures_detector import WdmNetworkFailureDetector


class TestWdmNetworkFailureDetector(object):

@patch('wdm_oms_failures_detector.atom.cache')
def test_update_wdm_cache_data(self, mocked_cache, df_oms):
mocked_cache.return_value.query_to_df.return_value = df_oms
wnfd = WdmNetworkFailureDetector() # now the cache helper is set to the mock
wnfd.update_wdm_cache_data()
mocked_cache.query_to_df.assert_called_once()

关于python - 修补作为另一个类的属性的类实例属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61815949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com