【问题标题】:Init params with patch and Mock with urllib2使用补丁初始化参数并使用 urllib2 进行模拟
【发布时间】:2012-01-21 03:22:14
【问题描述】:

我将 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 和正确/预期的标头?

这可能吗?

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    因为创建Request 实例没有副作用,所以您不应该模拟urllib2.Request,而是检查传递给您模拟的@987654324 的真实 Request 实例@ 来验证它是否具有正确的状态。

    【讨论】:

    • 好吧,这很难反驳 :) 赞成正确,但我会将 Eric Fortin 的答案标记为“正确”——以防万一它可能有助于将来有人找到答案.
    【解决方案2】:

    虽然我同意 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()
    

    【讨论】:

    • 是的... grncdr 提出了一个很好的观点。但是,我选择这个作为答案,因为它可能对某人有所帮助。我做错了什么是试图测试“实例”。应该在“MockClass”上做。谢谢!
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 2012-12-29
    • 2017-02-10
    • 2013-03-23
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多