我正在努力理解如何从Python中的类依赖关系中存根一个类/模拟所有方法&;皮特斯特。下面的清单显示了我正在测试的类。它有两个内部依赖项:OWMProxy
和PyOwmDeserializer
测试中的班级
class OWM:
def __init__(self, api_key: str, units: WeatherUnits) -> None:
self._api_key = api_key
self._units = units
self._pyorm = OWMProxy.from_api_key(api_key)
self._deserializer = PyOwmDeserializer()
def at(self, city: str, iso_datetime: str) -> ForecastModel:
weather = self._pyorm.for_time(city, iso_datetime)
return self._deserializer.deserialize(weather, self._units)
def day(self, city: str, day: str) -> ForecastModel:
weather = self._pyorm.for_day(city, day)
return self._deserializer.deserialize(weather, self._units)
def now(self, city: str) -> ForecastModel:
weather = self._pyorm.now(city)
return self._deserializer.deserialize(weather, self._units)
我的问题是,当使用PyTest进行单元测试时,是否可以模拟整个类依赖关系
目前,我的单元测试使用mocker来模拟每个类方法,包括init方法
我可以使用依赖注入方法,即为内部反序列化器和代理接口创建一个接口,并将这些接口添加到被测类的构造函数中
或者,我可以使用unittest.mock
模块进行测试,如建议的here。在pytest-mock
中是否有等效的功能
到目前为止的单元测试…
@pytest.mark.skip(reason="not implemented")
def test_owm_initialises_deserializer(
default_weather_units: WeatherUnits, mocker: MockFixture
) -> None:
api_key = "test_api_key"
proxy = OWMProxy(py_OWM(api_key))
patch_proxy = mocker.patch(
"wayhome_weather_api.openweathermap.client.OWMProxy.from_api_key",
return_value=proxy,
)
patch_val = mocker.patch(
"wayhome_weather_api.openweathermap.deserializers.PyOwmDeserializer",
"__init__",
return_value=None,
)
owm = OWM(api_key, default_weather_units)
assert owm is not None
您可以模拟整个类并控制其方法的返回值和/或副作用,就像它在docs中所做的那样
假设被测试的类位于src.py
test_owm.py
输出
如您所见,我们能够控制模拟依赖项的方法的返回值
相关问题 更多 >
编程相关推荐