2014-09-12 53 views
7

我想單元測試我的班級,它在另一個名爲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)

回答

10

你想這樣的:

@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。你列出這是你嘗試過的一種方法不起作用的,但我只是試過了,而且對我來說效果很好。當你嘗試時,你有什麼問題?

+2

+1我前幾天有一個相關問題,並且要指出,即使'client_blogger'不存在於你的測試模塊的命名空間中(因爲你使用'from client_blogger import BloggerClient'),字符串「' client_blogger.BloggerClient._jload''仍然正確,而不是「BloggerClient._jload''。 – chepner 2014-09-12 16:13:34

+0

@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

+0

@chepner I甚至將我的導入行更改爲'import client_blogger'。仍然全部失敗。 – BBedit 2014-09-13 14:32:26

相關問題