【发布时间】:2018-05-16 08:19:47
【问题描述】:
我有这种设置,我正在测试一个正在使用另一个类的类,我想模拟后者,所以我只测试第一个类本身。
nuclear_reactor.py:
class NuclearReactor():
def __init__(self):
print "initializing the nuclear reactor"
def start(self):
print "starting the nuclear reactor"
nuclear_manager.py:
from nuclear_reactor import NuclearReactor
class NuclearManager():
def __init__(self):
print "manager creating the nuclear reactor"
self.reactor = NuclearReactor()
def start(self):
print "manager starting the nuclear reactor"
self.reactor.start()
test_nuclear_manager.py:
from mock import Mock
import nuclear_manager
from nuclear_manager import NuclearManager
def test():
mock_reactor = nuclear_manager.NuclearReactor = Mock()
nuke = NuclearManager()
nuke.start()
nuke.start()
print mock_reactor.mock_calls
print mock_reactor.start.call_count
test()
我想测试的是 NuclearReactor.start 被调用,
但是当我运行它时,我得到:
manager creating the nuclear reactor
manager starting the nuclear reactor
manager starting the nuclear reactor
[call(), call().start(), call().start()]
0
我完全理解,因为start 是实例的属性而不是类的属性,我可以解析mock_calls,但是没有更好的方法来检查实例化模拟类的调用是造出来的?
我可以在NuclearManager 中使用依赖注入来传递一个模拟NuclearReactor,但我认为还有另一种只使用模拟的方法。
【问题讨论】:
-
为什么你给经理打了两次电话,
.start()却被打了一次? -
是的,您应该将一个实例注入
NuclearManager,因为您的代码现在使管理器将其reactor实例设置为默认值。只有程序的最高级别部分应该有默认值。 -
@quamrana:OP 是否应该使用依赖注入是一个完全独立的讨论。并非所有被测代码都适合依赖注入。
标签: python python-2.7 unit-testing mocking