簡體   English   中英

單元測試模擬 urllib.request.urlretrieve() Python 3 和內部函數

[英]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()) 嗎?

如何嘲笑它?

為了解決這個問題,我對我的代碼做了一些修改,然后用模擬創建了測試。

備注:我仍在學習單元測試和模擬,這里的任何新評論都很好,因為我不確定我是否采用了正確的方法:)

  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())

好吧,我不知道還有哪些可以測試,但首先我認為它很好:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM