[英]Mock an attribute in python class for unit testing
我想在單元測試中模擬self.var
,因為名稱服務器查找失敗。 我已經嘗試使用patch
,但是無法正常工作。 模擬self.var
的最佳方法是什么?
我的班級定義如下:
class A:
def __init__(self):
self.var = Pyro4.Proxy(self.ns.lookup(temp_name))
def method_1(self):
.....
我的單元測試如下:
class TestA(TestCase):
def setUp(self):
self.temp_A = classA()
def test_method(self):
self.temp_A.method_1()`
您可以在這里做兩件事,最簡單的就是修補Pyro4.Proxy,如下所示:
from unittest.mock import patch
# or from mock import create_autospec if you are in py2
class TestA(TestCase):
@patch('Pyro4.Proxy', autospec=True)
def test_method(self):
temp_A = A()
temp_A.method_1()
訣竅是修補“正確的對象”,直到實例化之后再實例化該類(在您的測試函數內部), Pyro4.Proxy
是我可以從您的代碼中推斷出的最佳對象,但是如果您的class A
在my_module中,也許最好的修補對象是my_module.Pyro4.Proxy
。
您可能想要做的另一件事就是模擬var變量。 然后在__init__
方法中定義self.var
並假設您不想模擬整個__init__
方法,則可以
from unittest.mock import create_autospec
# or from mock import create_autospec if you are in py2
class TestA(TestCase):
def setUp(self):
self.temp_A = classA()
self.temp_A.var = create_autospec(Pyro4.Proxy)(None)
def test_method(self):
self.temp_A.method_1()
如果您可以稍微重構一下類,我建議您將var設為易於模擬的屬性
class A(object):
def __init__(self):
...
@property
def var(self):
return Pyro4.Proxy(self.ns.lookup(temp_name))
def method_1(self):
.....
然后你的測試課可以是
from unittest.mock import create_autospec, PropertyMock
class TestA(TestCase):
def setUp(self):
self.temp_A = classA()
type(self.temp_A).var = PropertyMock(side_effect=lambda *x, **y: create_autospec(Pyro4.Proxy)(*x, **y))
def test_method(self):
self.temp_A.method_1()
我認為處理此問題的最簡單方法是取消類測試。
class AStub(A):
def __init__(self):
# By pass super constructor
self.var = None
class TestA(TestCase):
def setUp(self):
self.helper = AStub()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.