从模拟文档中,我无法理解如何成功实现以下类型的模式。在课堂内不存在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)
答案 0 :(得分:1)
首先,正如univerio的评论建议你应该这样打电话给你:
mock('https://google.com')
你的测试应该在修复之后通过,但可能是模拟不能做你真正想要的。我在使用spec
和autospec
时遇到了一些问题。
使用Mock(spec=)
创建的模拟不会检查调用它们的参数数量。我只是查看了文档而他们没有说明这一点,但出于某种原因,我预计它会起作用。 Autospecced模拟会检查参数。
默认情况下,spec
和autospec
函数模拟会在您调用它们时返回模拟对象。当您模拟不返回任何内容的函数时,这可能不是您想要的。在这种情况下,您可以手动设置return_value
:
def foo():
pass
mock_foo = Mock(spec=foo, return_value=None)
mock_foo()