Cómo burlarse de pysvn

Estoy trabajando en un module de Python que supone sacar algún código de SVN y comstackrlo. Después de mucha refacturación de algún código henetworkingado, obtuve una cobertura bastante decente del código, sin embargo, tengo un gran vacío en el código que usa pysvn .

Es cierto que el concepto de object Mock es nuevo para mí, pero después de leer parte de la documentation de MiniMock y pymox (ambos están disponibles en mi entorno), llegué a la conclusión de que necesitaría capturar algunos resultados de pysvn y devolverlos en mi código de testing

Pero aquí me encuentro (perdón por el juego de palabras) en un encurtido. Los objects devueltos por los commands pysvn.Client () no se comportan bien cuando bash agruparlos o incluso compararlos.

¿Alguna sugerencia de cómo serializar o de otra manera burlarse de pysvn u otros objects que no sean pythonicos?

Naturalmente, estoy dispuesto a aceptar que estoy abordando este problema desde la dirección equivocada, o que simplemente soy un idiota. En ese caso, cualquier consejo será útil.

Información adicional 0:

Algunos objects pysvn se pueden networkingucir a un dict accediendo a su propiedad de data , y se pueden reproducir pasando esta __init__() al __init__() apropiado

Por ejemplo:

 >>> 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'> 

Sin embargo, dentro de este object puede haber algunos objects que no se pueden despegar:

 >>> cPickle.dumps(d) Traceback (most recent call last): File "<stdin>", line 1, in ? cPickle.UnpickleableError: Cannot pickle <type 'node_kind'> objects 

Información adicional 1:

En cuanto a @H. Solicitud de Dunlop , aquí hay un fragment (simplificado) de mi código, que permite get una list de SVN y dejar que el usuario elija un elemento de esa list:

 class Menu(object): """a well covenetworking class""" # ... class VersionControl(object): """A poorly covenetworking 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 esta respuesta utilicé minimock, en realidad no estoy familiarizado con él y sugeriría usar http://www.voidspace.org.uk/python/mock/ en su lugar. Este código terminaría un poco más limpio. Pero especificó minimock o pymox así que aquí va:

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

Si desea probar más del dictionary subyacente devuelto por pysvn, puede modificar la list de tuplas con dictionarys dentro de él para que lo devuelva. Incluso podría escribir un poco de código que acaba de arrojar los dictionarys de los objects pysvn.

¿Ha considerado el uso de: pickle en lugar de cPicles? " Módulo cPickle, los callables Pickler () y Unpickler () son funciones, no classs. Esto significa que no puede usarlos para derivar las subclasss personalizadas de decapado y descamado " .

    Intereting Posts