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

标签 python module mocking

我想对我的类进行单元测试,它位于另一个名为 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/

相关文章:

java - 当我模拟一个类时, stub 值不会被返回

python - 导入一个未打包模块的python类,并在它自己的线程中运行

python - 值错误: setting an array element with a sequence while using scale

python - 如何使用 Boto3 将空文件夹上传到 S3?

python - 使用 gevent.queue.Queue.get() : gevent. hub.LoopExit: 'This operation would block forever'

javascript - Angular 2 - 延迟加载模块的生命周期 Hook

javascript - 在两个 JavaScript 模块之间传递变量不起作用

javascript - 仅在监听器函数中加载脚本/模块会导致问题吗?

java - 在 Java 类中进行模拟

testing - 试图在 Flask-SQLAlchemy 中模拟模型的问题