在python中模拟协作者的最佳方法是什么?

时间:2018-04-01 15:32:49

标签: python unit-testing mocking python-unittest python-mock

我上课了:

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并且不要将它作为参数传递?

是否有一种正确的方法或嘲笑合作者并不重要?

1 个答案:

答案 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)