[英]How can I use urllib.request.urlretrieve with python 2.7
[英]Unit test mock urllib.request.urlretrieve() Python 3 and internal function
如何模擬或單元測試使用urllib.request.urlretrieve
保存文件的函數/方法?
這是我要測試的代碼部分:
from urllib import request
from config import cvs_site, proxy
class Collector(object):
"""Class Collector"""
...
def __init__(self, code_num=""):
self.code_num = sec_id.upper()
self.csv_file = "csv_files/code_num.csv"
# load proxy if it is configured
if proxy:
proxies = {"http": proxy, "https": proxy, "ftp": proxy}
proxy_connect = request.ProxyHandler(proxies)
opener = request.build_opener(proxy_connect)
request.install_opener(opener)
def _collect_data():
try:
print("\nAccessing to retrieve CVS informations.")
request.urlretrieve(cvs_site, self.cvs_file)
except error.URLError as e:
exit("\033[1;31m[ERROR]\033[1;00m {0}\n".format(e))
...
def some_function(self):
_collect_data()
...
我應該測試所有內部函數 (_functions()) 嗎?
如何嘲笑它?
為了解決這個問題,我對我的代碼做了一些修改,然后用模擬創建了測試。
備注:我仍在學習單元測試和模擬,這里的任何新評論都很好,因為我不確定我是否采用了正確的方法:)
函數 _collect_data() 不需要在__init__()
里面,然后我把它移到外面。
_collect_data 是一個具有特定操作的函數,保存文件,但需要返回一些東西才能模擬使用它。
參數從類移到函數
新的代碼看起來像這樣:
from config import proxy
from config import cvs_site
from urllib import request
class Collector(object):
"""Class Collector"""
def __init__(self):
self.csv_file = "csv_files/code_num.csv"
# load proxy if it is configured
if proxy:
proxies = {"http": proxy, "https": proxy, "ftp": proxy}
proxy_connect = request.ProxyHandler(proxies)
opener = request.build_opener(proxy_connect)
request.install_opener(opener)
def _collect_data():
try:
print("\nAccessing to retrieve CVS informations.")
return request.urlretrieve(cvs_site, self.cvs_file)
except error.URLError as e:
return "\033[1;31m[ERROR]\033[1;00m {0}\n".format(e)
...
def some_function(self, code_num=""):
code_num = code_num.upper()
self._collect_data()
...
為了測試這段代碼,我創建了這個:
import unittest
import mock
from saassist.datacollector import Collector
class TestCollector(unittest.TestCase):
def setUp(self):
self.apar_test = Collector()
@mock.patch("saassist.datacollector.request")
def test_collect_data(self, mock_collect_data):
mock_collect_data.urlretrieve.return_value = "File Collected OK"
self.assertEqual("File Collected OK", self.apar_test._collect_data())
好吧,我不知道還有哪些可以測試,但首先我認為它很好:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.