【问题标题】:Mock object used in parent class父类中使用的模拟对象
【发布时间】:2018-04-26 09:31:07
【问题描述】:

我在不同的包中有两个类,其中一个继承自另一个。我想测试子类。

那么如何模拟父类中使用的外部对象呢? 我很困惑他们现在驻留在哪个命名空间中。

【问题讨论】:

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


    【解决方案1】:
    class A:
        def foo(self):
            # Make some network call or something
    
    
    class B(A):
        def bar(self):
            self.foo()
            ...
    
    
    class BTestCase(TestCase):
        def setUp(self):
            self.unit = B()
    
        def test_bar(self):
             with mock.patch.object(self.unit, 'foo') as mock_foo:
                 mock_foo.return_value = ...
                 result = self.unit.bar()
                 self.assertTrue(mock_foo.called)
                 ...
    

    【讨论】:

    • 我给你的答案 +1,因为它暗示了 mock.patch.object 的使用,我以前不知道,但该解决方案的问题是,如果你需要模拟某些东西在 __init__() 中使用它不起作用。我在下面添加了解决方案
    【解决方案2】:

    要模拟在父模块中导入和使用的任何内容,您需要在父模块中模拟它。

    a/a.py

    import subprocess
    
    class A(object):
        def __init__(self):
            print(subprocess.call(['uname']))
    

    b/b.py

    from a.a import A
    
    class B(A):
        def __init__(self):
            super(B, self).__init__()
    

    在你的单元测试中

    from b.b import B
    
    from unittest.mock import patch
    
    with patch('a.a.subprocess.call', return_value='ABC'):
        B()
    
    ABC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多