<p>Python中不需要IOC。这是一个Python式的方法。在</p>
<pre><code>class MyBusinessClass(object):
def __init__(self, engine=None):
self._engine = engine or RepperEngine()
# Note: _engine doesn't exist until constructor is called.
def doSomething(self):
## bla bla ...
success
class Test(unittest.TestCase):
def test_XXXXX_whenYYYYYY(self):
mock_engine = mock.create_autospec(RepperEngine)
unit = MyBusinessClass(mock_engine)
unit.doSomething()
self.assertTrue(.....)
</code></pre>
<p>您还可以去掉类来绕过构造函数</p>
^{2}$
<p>然后在你的设置中</p>
<pre><code>def setUp(self):
self.helper = MyBusinessClassFake()
</code></pre>
<p>现在在测试中,您可以使用上下文管理器。在</p>
<pre><code>def test_XXXXX_whenYYYYYY(self):
with mock.patch.object(self.helper, '_engine', autospec=True) as mock_eng:
...
</code></pre>
<p>如果您想在不使用构造函数的情况下注入它,那么可以将其作为类属性添加。在</p>
<pre><code>class MyBusinessClass():
_engine = None
def __init__(self):
self._engine = RepperEngine()
</code></pre>
<p>现在要绕过存根<code>__init__</code>:</p>
<pre><code>class MyBusinessClassFake(MyBusinessClass):
def __init__(self):
pass
</code></pre>
<p>现在您可以简单地指定值:</p>
<pre><code>unit = MyBusinessClassFake()
unit._engine = mock.create_autospec(RepperEngine)
</code></pre>