带补丁的Init params和带有urllib2的Mock

时间:2012-01-21 03:22:14

标签: python unit-testing mocking

我正在使用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和正确/预期的标题?

这可能吗?

2 个答案:

答案 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()