我想單元測試我的班級,它在另一個名爲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)
+1我前幾天有一個相關問題,並且要指出,即使'client_blogger'不存在於你的測試模塊的命名空間中(因爲你使用'from client_blogger import BloggerClient'),字符串「' client_blogger.BloggerClient._jload''仍然正確,而不是「BloggerClient._jload''。 – chepner 2014-09-12 16:13:34
@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
@chepner I甚至將我的導入行更改爲'import client_blogger'。仍然全部失敗。 – BBedit 2014-09-13 14:32:26