我想单元测试我的班级,它在另一个名为client_blogger.py
的文件中。如何导入自己的模块进行模拟? (导入错误:没有名为my_module的模块!)
我的单元测试文件位于同一个目录中。除了当我试图嘲笑我自己的方法之外,我所有的其他单元测试都可以工作。
## unit_test_client_blogger.py
import mock
import json
from client_blogger import BloggerClient, requests
Class TestProperties():
@pytest.fixture
def blog(self):
return BloggerClient(api_key='123', url='http://example.com')
@mock.patch('client_blogger._jload')
@mock.patch('client_blogger._send_request')
def test_gets_blog_info(self, mock_send, mock_jload):
""" Get valid blog info from API response. """
valid_blog_info = 'some valid json api response here'
parsed_response = json.loads(valid_blog_info)
correct_blog_id = '7488272653173849119'
mock_jload.return_value = valid_blog_info
id = self.blog().get_blog_info(parsed_response)
assert id == correct_blog_id
这里是client_blogger.py文件内容:
# client_blogger.py
import requests, json
class BloggerClient(object):
""" Client interface for Blogger API. """
def __init__(self, key, url):
# removed some code here for brevity
def _send_request(self, api_request):
""" Sends an HTTP get request to Blogger API.
Returns HTTP response in text format. """
# snip
def _jload(self, api_response):
""" Accepts text API response. Returns JSON encoded response. """
# snip
def get_blog_info(self):
""" Makes an API request. Returns Blog item information. """
request = '{b}/blogs/byurl?url={u}&key={k}'.format(b=self.base, u=self.url, k=self.key)
txt_response = self.send_request(request)
response = self._jload(txt_response)
return response['id']
我想模拟出self.send_request()
和self._jload()
方法在上面的方法调用。
但模拟模块抱怨:ImportError: No module named client_blogger
。
错误必须躺在这里:
@mock.patch('client_blogger._jload')
@mock.patch('client_blogger._send_request')
我为了得到mock.patch找到我的模块或类尝试了许多变化。但他们都没有工作。
我已经试过以下:其中工作
@mock.patch('client_blogger.BloggerClient._jload')
@mock.patch('BloggerClient._jload')
@mock.patch('._jload')
无。任何想法如何从我自己的模块mock.patch方法?
(这似乎很奇怪,因为我可以mock.patch其他模块,只是不是我自己:-s)
+1我前几天有一个相关问题,并且要指出,即使'client_blogger'不存在于你的测试模块的命名空间中(因为你使用'from client_blogger import BloggerClient'),字符串“' client_blogger.BloggerClient._jload''仍然正确,而不是“BloggerClient._jload''。 – chepner 2014-09-12 16:13:34
@dano它仍然不适用于我:'target ='client_blogger.BloggerClient'ImportError:没有名为client_blogger的模块 build \ bdist.win32 \ egg \ mock.py:1098:ImportError ====== =============== 1次失败,4次通过0.23秒======================' – BBedit 2014-09-13 14:22:55
@chepner I甚至将我的导入行更改为'import client_blogger'。仍然全部失败。 – BBedit 2014-09-13 14:32:26