我正在尝试研究单元测试和模拟。 我使用现有的代码来测试模拟,我真的很困惑。
我的疑问是:如何使用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())吗?
如何嘲笑它?
答案 0 :(得分:0)
为了解决这个问题,我对我的代码做了一些修改,然后用mock创建了正确的测试。 备注:我还在学习单元测试和模拟,这里的任何新评论都很好,因为我没有确信我采用了正确的方式:)
函数_collect_data()没有必要在 init ()内部,然后我把它移到了外面。
_collect_data是一个具有特定操作的函数,保存文件,但需要返回一些能够使用它来模拟的工作。
将参数从Class移到
新代码看起来像:
#!/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())
好吧,我不知道还有哪些可以测试它,但是开始我觉得它很好:)