我正在使用Python 2.6.5和Mock 0.7.2并进行单元测试,我在一个类中使用补丁装饰器。
@patch('urllib2.Request')
def test_do_my_call(self, MockClass):
"""will test that _do_my_call is getting called with correct values"""
instance = MockClass.return_value
mock_urlopen = Mock()
mock_urlopen.return_value = 'foo'
urllib2.urlopen = mock_urlopen
response = do_something('MyData')
self.assertEqual(mock_urlopen.call_count, 1)
self.assertEqual(response, 'foo')
上面的代码通过,它验证了urlopen至少被调用,但它看起来仍然有点弱。
“do_something”方法创建一个新请求(因此需要补丁),然后用它调用urlopen(如上所述,我验证它被调用)。但是,我想知道是否有办法测试从“do_something”中传递给urllib2.Request()的参数。例如,do_something是否传递了正确/预期的URL和正确/预期的标题?
这可能吗?
答案 0 :(得分:3)
由于创建Request
实例没有副作用,因此您不应该嘲笑urllib2.Request
,而是检查获得的真实 Request
实例传递给您的模拟urlopen
以验证它是否具有正确的状态。
答案 1 :(得分:1)
虽然我同意grncdr,但如果你的课程有副作用,那么你可以这样做:
from mock import Mock, patch
class MyClass(object):
def __init__(self, a, b, c):
pass
def method_to_test():
m = MyClass(1, 'test', {'key' : 'value'})
@patch('__main__.MyClass')
def test_my_method(mock_class):
method_to_test()
mock_class.assert_called_with(1, 'test', {'key': 'value'})
test_my_method()