我上课了:
class myclass:
def __init__(self):
self.collaborator = Coll()
def tested_method(self):
val = self.collaborator.val
val_2 = self.collaborator.get_val2()
....
模仿合作者的一种方法就是这样
class TestMainModel(unittest.TestCase):
def setUp(self):
mock_c = mock.Mock()
mock_c.val = 12
mock_c.get_val2 = mock.Mock(return_value=13)
self.sut = myclass(mock_c) # pass as argument
或
class TestMainModel(unittest.TestCase):
def setUp(self):
mock_c = mock.Mock()
mock_c.val = 12
mock_c.get_val2 = mock.Mock(return_value=13)
self.sut = myclass()
self.sut.collaborator = mock_c # set when sut is created but quite bad when collaborator is loading files from disk or takes more time to create?
或
class TestMainModel(unittest.TestCase):
def setUp(self):
mock_c = mock_collaborator()
self.sut = myclass(mock_c) # pass as argument
class mock_collaborator: # use new class
val = 12
def get_val2(self):
return 13
或者使用@ mock.patch并且不要将它作为参数传递?
是否有一种正确的方法或嘲笑合作者并不重要?
答案 0 :(得分:0)
IMO最好的方式是依赖注入。
# MyClass
def __init__(self, collaborator=None)
self.collaborator = collaborator or Coll()
from unittest.mock import create_autospec, Mock
def setUp
mock_c = create_autospec(
Coll,
get_val=Mock(return_value=12),
get_val2=Mock(...),
)
self.sut = myclass(collaborator=Coll)