gpt4 book ai didi

python - 如何导入自己的模块进行模拟? (导入错误 : no module named my_module!)

转载 作者:太空狗 更新时间:2023-10-29 18:03:53 25 4
gpt4 key购买 nike

我想对我的类进行单元测试,它位于另一个名为 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。您将其列为您尝试过但不起作用的方法之一,但我只是尝试过,对我来说效果很好。您尝试这样做时遇到了什么问题?

关于python - 如何导入自己的模块进行模拟? (导入错误 : no module named my_module!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25810793/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com