Python - 如何模拟单个函数

时间:2014-05-21 21:59:15

标签: python mocking

从模拟文档中,我无法理解如何成功实现以下类型的模式。在课堂内不存在fetch_url

我在auth.py文件中的功能:

def fetch_url(url, method=urlfetch.GET, data=''):
    """Send a HTTP request"""

    result = urlfetch.fetch(url=url, method=method, payload=data,
                            headers={'Access-Control-Allow-Origin': '*'})

    return result.content

我的测试:

import unittest
from mock import Mock

class TestUrlFetch(unittest.TestCase):

    def test_fetch_url(self):
        from console.auth import fetch_url

        # Create a mock object based on the fetch_url function
        mock = Mock(spec=fetch_url)

        # Mock the fetch_url function
        content = mock.fetch_url('https://google.com')

        # Test that content is not empty
        self.assertIsNotNone(content)

如果我所做的事情完全朝着错误的方向发展,请详细说明正确的解决方案。

测试不起作用,并产生以下错误:

======================================================================
ERROR: test_fetch_url (console.tests.test_auth.TestUrlFetch)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/bengrunfeld/Desktop/Work/code/wf-ghconsole/console/tests/test_auth.py", line 34, in test_fetch_url
    content = mock.fetch_url('https://google.com')
  File "/Users/bengrunfeld/.virtualenvs/env2/lib/python2.7/site-packages/mock.py", line 658, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute 'fetch_url'
-------------------- >> begin captured logging << --------------------
root: DEBUG: Using threading.local
--------------------- >> end captured logging << ---------------------

----------------------------------------------------------------------
Ran 1 test in 0.277s

FAILED (errors=1)

1 个答案:

答案 0 :(得分:1)

首先,正如univerio的评论建议你应该这样打电话给你:

mock('https://google.com')

你的测试应该在修复之后通过,但可能是模拟不能做你真正想要的。我在使用specautospec时遇到了一些问题。

  1. 使用Mock(spec=)创建的模拟不会检查调用它们的参数数量。我只是查看了文档而他们没有说明这一点,但出于某种原因,我预计它会起作用。 Autospecced模拟会检查参数。

  2. 默认情况下,specautospec 函数模拟会在您调用它们时返回模拟对象。当您模拟不返回任何内容的函数时,这可能不是您想要的。在这种情况下,您可以手动设置return_value

    def foo():
        pass
    
    mock_foo = Mock(spec=foo, return_value=None)
    mock_foo()