[英]How to override (not patch) a single method in a python unit test
我已经搜索了几个小时。 甚至找不到试图这样做的人。 嗯
我相信我必须重写类实例中的单个方法。 我不是说patch(return_value=)
。 我需要使所讨论的方法做一些涉及self
事情。
我会尽力分解。 随意地改写并包括我尝试过的许多方法之一,这是行不通的...
class SetupClass(object):
def set_some_stuff(self):
data_list = functon_cannot_be_run_on_test_platform()
self.something = data_list[0]
self.something_else = data_list[1]
class UUT(object):
self.config = SetupClass()
assert self.config.something == 'foo'
class UnitTests(TestCase):
@patch('SetupClass')
def test_UUT(self, mock1):
def WedgeClass(SetupClass):
def set_some_stuff(self):
self.something = 'foo'
pass # I'm a Python newbie, in too deep
wedge_class = WedgeClass()
mock1.return_value = wedge_class # doesn't work. context errors
uut = UUT() # <-- would crash here, because assert above
假设我无法对UUT
或SetupClass
进行更改。
测试甚至无法启动,因为断言将由于SetupClass.functon_cannot_be_run_on_test_platform()
而失败。 请注意 ,由于原因,仅嘲笑SetupClass.functon_cannot_be_run_on_test_platform
并不能解决问题。
在ATM上,我认为避免这种混乱的唯一方法是以某种方式覆盖SetupClass.set_some_stuff
。 我不能简单地模拟整个类,因为UUT
非常依赖于其其他功能。 我需要一切都按原样工作,除了这个方法之外,我还需要该方法能够在与最初意图相同的上下文中self
访问。
我尝试了各种涉及子类化和模拟.return_value等的事情。我宁愿不记得引起的痛苦。 :p
我的王国首先是测试驱动的代码! 此代码包含一些相互依赖的卷积。 :-/
除了示例代码中的多个错误外,我还在咖啡馆里写下了自己的头……
问题是(主要是)我使用return_value
而不是side_effect
将修补的类替换为自己的子类。
现在,我可能需要更清楚地set_some_stuff
,我的需要是在被测单元(UUT)中的类中重写单个方法set_some_stuff
, set_some_stuff
该类。
该方法发出多个“ self.foo = bar”语句,出于测试目的,我想对其进行更改。 因此,仅嘲笑该方法的(未使用的)返回值是不够的……并且patch.object似乎丢失了类上下文,“'自身'未知”等。
最后 ,这是工作代码,执行我需要做的...
import unittest
import mock
class SetupClass(object):
def set_some_stuff(self):
data_list = ['data not available', 'on test_platform'] # CRASH!
self.something = data_list[0]
self.something_else = data_list[1]
class UUT:
def __init__(self):
self.config = SetupClass()
self.config.set_some_stuff()
assert self.config.something == 'foo' # <-- used to crash before here ...
self.got_here = True # ... but now the override method from
# WedgeClass is being used! :=)
"""
Subclass the original class, overriding just the method in question. Then set
the subclass as the side_effect of the patched original, effectively replacing it.
"""
class WedgeClass(SetupClass):
def set_some_stuff(self):
self.something = 'foo'
pass # I'm a Python newbie, in too deep
class UnitTests(unittest.TestCase):
@mock.patch(__module__+'.SetupClass')
def test_UUT(self, mock1):
wedge_class = WedgeClass()
mock1.side_effect = WedgeClass # <--- Ureka! 'side_effect' not 'return_value' was the ley!
uut = UUT()
self.assertTrue(uut.got_here)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.