单元测试模拟urllib.request.urlretrieve()Python 3和内部函数

时间:2017-01-10 17:39:48

标签: python unit-testing mocking

我正在尝试研究单元测试和模拟。 我使用现有的代码来测试模拟,我真的很困惑。

我的疑问是:如何使用urllib.request.urlretrieve来保存文件的类中对内部函数进行模拟或单元测试? :)

这是我试图测试的代码的一部分:

r[sample(1:ncell(r), 30)] <- NA # add NA values to example raster

gol_fun <- function(x) {

  # more general definition of center cell for weight matrices with odd side size
  center <- x[ceiling(length(x)/2)]

  if (center==0 | is.na(center)) { # handle NA values
    return(center)
  } 

  ncells <- sum(x, na.rm=TRUE)

  if (ncells<5) { #  window with with less than 5 cells die
    return(0)
  } else if (ncells >= 5) { # window with 5 or more cells live
    return(1)
  }
}




gameOfLife <- function(x) {
  f <- focal(x, w=w, fun=gol_fun, pad=TRUE, padValue=0)
}


plot(r)
plot(gameOfLife(r))

我应该测试所有内部函数(_functions())吗?

如何嘲笑它?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我对我的代码做了一些修改,然后用mock创建了正确的测试。 备注:我还在学习单元测试和模拟,这里的任何新评论都很好,因为我没有确信我采用了正确的方式:)

  1. 函数_collect_data()没有必要在 init ()内部,然后我把它移到了外面。

  2. _collect_data是一个具有特定操作的函数,保存文件,但需要返回一些能够使用它来模拟的工作。

  3. 将参数从Class移到

  4. 新代码看起来像:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #
    # 
    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()
    ...
    

    为了测试这段代码我创建了这个:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    #
    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())
    

    好吧,我不知道还有哪些可以测试它,但是开始我觉得它很好:)