[英]How to explain difference between “import my_module” and “from my_module import my_str”?
[英]How to import own module for mocking? (import error: no module named my_module!)
我想对我的类进行单元测试,该类位于另一个名为client_blogger.py
文件中。
我的单元测试文件位于同一目录中。 除了我试图模仿我自己的方法之外,我的所有其他单元测试都有效。
## 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()
方法调用。
但Mock模块抱怨: 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)
你要这个:
@mock.patch('client_blogger.BloggerClient._jload')
@mock.patch('client_blogger.BloggerClient._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
BloggerClient
实现来自client_blogger
模块,因此您需要修补client_blogger.BloggerClient
。 你列举的那个是你试过的不起作用的东西,但我只是尝试过,它对我来说很好。 你尝试的时候有什么问题?
对于python3,格式如下:
from unittest.mock import patch
@patch('client_blogger.BloggerClient._jload')
.
.
.
文档: https : //docs.python.org/3/library/unittest.mock.html#patch
这非常非常重要:
patch()很容易使用。 关键是在正确的命名空间中进行修补。 请参阅补丁的部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.