如何导入自己的模块进行模拟?(导入错误:没有名为my_module的模块!)

BBe*_*dit 13 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
Run Code Online (Sandbox Code Playgroud)

这是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']
Run Code Online (Sandbox Code Playgroud)

我想在上面的方法中模拟self.send_request()self._jload()方法调用.

但模拟模块抱怨:ImportError: No module named client_blogger.

错误必须在这里:

@mock.patch('client_blogger._jload')
@mock.patch('client_blogger._send_request')
Run Code Online (Sandbox Code Playgroud)

我尝试了很多变化,以便让mock.patch找到我的模块或类.但他们都没有奏效.

我尝试过以下方法:

@mock.patch('client_blogger.BloggerClient._jload')
@mock.patch('BloggerClient._jload')
@mock.patch('._jload')
Run Code Online (Sandbox Code Playgroud)

这些都不起作用.任何想法如何从我自己的模块mock.patch方法?

(看起来很奇怪,因为我可以mock.patch其他模块,而不是我自己的:-s)

dan*_*ano 14

你要这个:

@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
Run Code Online (Sandbox Code Playgroud)

BloggerClient实现从未来的client_blogger模块,所以你需要修补client_blogger.BloggerClient.你列举的那个是你试过的不起作用的东西,但我只是尝试过,它对我来说很好.你尝试的时候有什么问题?

  • @ user2071506如果你在一个包中工作,你还必须包括包名:`@ mock.patch('package_name.client_blogger.BloggerClient._jload')`. (7认同)
  • +1前几天我遇到了一个相关的问题,并且想要指出,即使你的测试模块的命名空间中没有`client_blogger`(因为你使用`from client_blogger import BloggerClient`),字符串''client_blogger.BloggerClient ._jload'`仍然是正确的,而不是''BloggerClient._jload'. (3认同)