我正在开发一个Python模块,它应该从SVN中签出一些代码并构建它。在对一些遗留代码进行了多次重构之后,我得到了相当不错的代码覆盖率,但是,我在使用比斯文的代码中有一个巨大的漏洞。
诚然,Mock对象的概念对我来说是新的,但是在阅读了MiniMock和吡莫的一些文档(在我的环境中都是可用的)之后,我得出的结论是,我需要捕获一些pysvn输出,并将其返回到测试代码中。
但在这里,我发现我自己(原谅双关语)在泡菜。从pysvn.Client()命令返回的对象在我尝试对它们进行筛选时,甚至在比较它们时,都表现得不太好。
对于如何序列化或以其他方式模拟pysvn或其他非pythonic行为对象,有什么建议吗?
当然,我愿意接受我是从错误的方向来处理这个问题,或者我只是一个白痴。在这种情况下,任何建议都是有帮助的。
附加信息0:
一些pysvn对象可以通过访问它们的data属性来还原为dict,并且可以通过将这个dict传递到适当的__init__()来再现。
例如:
>>> svn=pysvn.Client()
>>> svn.list('http://svn/svn/')[0][0]
<PysvnList u'http://svn/svn'>
>>> d=svn.list('http://svn/svn/')[0][0].data
>>> pysvn.PysvnList(d)
<PysvnList u'http://svn/svn'>但是,在这个对象中,可能有一些不可选择的对象:
>>> cPickle.dumps(d)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
cPickle.UnpickleableError: Cannot pickle <type 'node_kind'> objects附加信息1:
至于@H. Dunlop请求,下面是我的代码的一个(简化的)片段,它允许从SVN中获取一个列表,并让用户从该列表中选择一个项:
class Menu(object):
"""a well covered class"""
# ...
class VersionControl(object):
"""A poorly covered class"""
def __init__(self):
self.svn = pysvn.Client()
# ...
def list(self, url):
"""svn ls $url"""
return [os.path.basename(x['path']) for (x,_) in self.svn.list(url)[1:]]
def choose(self, choice, url):
"""Displays a menu from svn list, and get's the users choice form it.
Returns the svn item (path).
"""
menu = Menu(prompt="Please choose %s from list:\n" % choice,
items=self.list(url),
muliple_choice=False)
menu.present()
return menu.chosen()发布于 2012-07-03 00:20:40
在这个答案中,我使用了minimock,实际上我并不太熟悉它,我建议使用http://www.voidspace.org.uk/python/mock/。这段代码最终会变得更清晰一些。但是您指定了minimock或pymox,下面是这样的:
from minimock import TraceTracker, Mock, mock
import unittest
import pysvn
from code_under_test import VersionControl
class TestVersionControl(unittest.TestCase):
def test_init(self):
mock_svn = Mock(name='svn_client')
mock('pysvn.Client', returns=mock_svn)
vc = VersionControl()
self.assertEqual(vc.svn, mock_svn)
def test_list_calls_svn_list_and_returns_urls(self):
tracker = TraceTracker()
test_url = 'a test_url'
mock_data = [
({'path': 'first result excluded'}, None),
({'path': 'url2'}, None),
({'path': 'url3', 'info': 'not in result'}, None),
({'path': 'url4'}, None),
]
vc = VersionControl()
mock('vc.svn.list', returns=mock_data, tracker=tracker)
response = vc.list(test_url)
self.assertEqual(['url2', 'url3', 'url4'], response)
self.assertTrue("Called vc.svn.list('a test_url')" in tracker.dump())
if __name__ == '__main__':
unittest.main()如果您想测试pysvn返回的更多底层字典,那么只需修改其中包含字典的元组列表就可以使其返回。您甚至可以编写一些代码,将字典从pysvn对象中删除。
发布于 2012-07-02 22:43:32
您考虑过使用:泡菜而不是cPicles吗?"cPickle模块--可调用的Pickler()和Unpickler()是函数,而不是类。这意味着您不能使用它们派生自定义的泡菜和去泡菜子类。“
https://stackoverflow.com/questions/11176496
复制相似问题