Python 3中如何对内部函数urllib.request.urlretrieve()进行单元测试模拟?

4

我该如何模拟或单元测试一个使用 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())吗?

如何模拟它?


1个回答

0
为了解决这个问题,我对我的代码进行了一些修改,然后使用模拟创建了测试。
备注:我仍在学习单元测试和模拟,任何新的评论都是好的,因为我不确定我是否走了正确的路线 :)
  1. 函数_collect_data()不需要在__init__()内部,所以我将其移到外部。

  2. _collect_data是一个具有特定操作的函数,保存文件,但需要返回一些内容才能使模拟与之配合工作。

  3. 参数从类移动到函数中

现在代码看起来像这样:
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())

嗯,我不知道还能为此测试什么,但是我认为开始是好的 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接