首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何模拟pysvn

如何模拟pysvn
EN

Stack Overflow用户
提问于 2012-06-24 09:55:27
回答 2查看 1K关注 0票数 2

我正在开发一个Python模块,它应该从SVN中签出一些代码并构建它。在对一些遗留代码进行了多次重构之后,我得到了相当不错的代码覆盖率,但是,我在使用比斯文的代码中有一个巨大的漏洞。

诚然,Mock对象的概念对我来说是新的,但是在阅读了MiniMock吡莫的一些文档(在我的环境中都是可用的)之后,我得出的结论是,我需要捕获一些pysvn输出,并将其返回到测试代码中。

但在这里,我发现我自己(原谅双关语)在泡菜。从pysvn.Client()命令返回的对象在我尝试对它们进行筛选时,甚至在比较它们时,都表现得不太好。

对于如何序列化或以其他方式模拟pysvn或其他非pythonic行为对象,有什么建议吗?

当然,我愿意接受我是从错误的方向来处理这个问题,或者我只是一个白痴。在这种情况下,任何建议都是有帮助的。

附加信息0:

一些pysvn对象可以通过访问它们的data属性来还原为dict,并且可以通过将这个dict传递到适当的__init__()来再现。

例如:

代码语言:javascript
复制
>>> 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'>

但是,在这个对象中,可能有一些不可选择的对象:

代码语言:javascript
复制
>>> 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中获取一个列表,并让用户从该列表中选择一个项:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-03 00:20:40

在这个答案中,我使用了minimock,实际上我并不太熟悉它,我建议使用http://www.voidspace.org.uk/python/mock/。这段代码最终会变得更清晰一些。但是您指定了minimock或pymox,下面是这样的:

代码语言:javascript
复制
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对象中删除。

票数 2
EN

Stack Overflow用户

发布于 2012-07-02 22:43:32

您考虑过使用:泡菜而不是cPicles吗?"cPickle模块--可调用的Pickler()和Unpickler()是函数,而不是类。这意味着您不能使用它们派生自定义的泡菜和去泡菜子类。“

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11176496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档