from mock import patch
from PyQt4 import Qt
@patch.object(Qt.QMessageBox, 'aboutQt')
def testShowAboutQt(self, mock):
self.win.actionAboutQt.trigger()
self.assertTrue(mock.called)
对于您的情况,它可能看起来像这样:
import mock
from mock import patch
def testClearWasCalled(self):
aw = aps.Request("nv1")
with patch.object(aw, 'Clear') as mock:
aw2 = aps.Request("nv2", aw)
mock.assert_called_with(42) # or mock.assert_called_once_with(42)
如果您输入错误assert_called_with(输入为assert_called_once或只是交换两个字母assert_called_wiht),您的测试仍然可以运行,因为Mock会认为这是一个模拟的函数,并愉快地沿着,除非您使用autospec=true。更多信息请阅读assert_called_once: Threat or Menace。
class fred(object):
def blog(self):
print "We Blog"
class methCallLogger(object):
def __init__(self, meth):
self.meth = meth
def __call__(self, code=None):
self.meth()
# would also log the fact that it invoked the method
#example
f = fred()
f.blog = methCallLogger(f.blog)
5条答案
按热度按时间yh2wf1be1#
我使用Mock(现在是py3.3+上的unittest.mock)来实现:
对于您的情况,它可能看起来像这样:
Mock支持很多有用的特性,包括修补对象或模块的方法,以及检查是否调用了正确的东西等。
Caveat emptor!(买家当心!)
如果您输入错误
assert_called_with
(输入为assert_called_once
或只是交换两个字母assert_called_wiht
),您的测试仍然可以运行,因为Mock会认为这是一个模拟的函数,并愉快地沿着,除非您使用autospec=true
。更多信息请阅读assert_called_once: Threat or Menace。jvlzgdj92#
如果你使用的是Python 3.3+。您可以使用内置的
unittest.mock
来Assert所调用的方法。对于Python 2.6+,使用滚动后端口Mock
,这是同样的事情。下面是您案例中的一个快速示例:
nzkunb0c3#
我不知道任何内置的东西。实现起来非常简单:
这要求对象本身不会修改self.b,这几乎总是正确的。
euoag5mw4#
是的,我可以给予你大纲,但我的Python有点生疏,我忙碌了,无法详细解释。
基本上,你需要在方法中放置一个代理,它将调用原始方法,例如:
这篇关于callable的StackOverflow answer可能会帮助你理解上面的内容。
详情:
虽然答案被接受了,但由于与Glenn的有趣讨论和几分钟的空闲时间,我想扩大我的答案:
qv7cva1a5#
您可以手动模拟
aw.Clear
,也可以使用pymox之类的测试框架。手动地,你会使用类似这样的东西来做:使用pymox,你可以这样做: