Stubs, Stubbing, Stubbers y SharePoint

 


Continuando con la lucha para crear Pruebas Unitarias para SharePoint (vea el posting sobre Mocks, Mocking, Mockers y SharePoint)…


Resumidas cuentas, de lo que se trata es de crear objetos «falsos» de SharePoint que se puedan utilizar en Unit Test de una forma fácil, rápida e indolora. Como estoy muy lejos de ser un conocedor de teoría de pruebas de software, he estado buscando información al respecto, y me he dado cuenta que lo que ando buscando en realidad son Stubs, no Mocks. Aunque Mocks pueden funcionar como Stubs (pero no al contrario), el asunto es un poco más claro ahora (?). Hay un articulo bastante bueno sobre la diferencia entre los dos: «Mocks aren’t Stubs» de Martin Fowler. Para que no se tengan que leer un artículo largo y pesado (aunque interesante), les cuento que un Mock falsifica y verifica la conducta del objeto, mientras que un Stub simplemente falsifica al objeto, sin importarle que está pasando con sus métodos y propiedades.


Después de luchar horas y horas con el asunto, sigo sin ver la luz. Mejor dicho, ya he visto la luz del amanecer dos días seguidos (después de todo un desarrollador no necesita dormir más de dos horas de cada 24, como todos sabemos), sin encontrar el camino, y ya estoy empezando a pensar que es porque simplemente no existe.


Veamos lo que he intentado hasta ahora:


1 – TypeMock es un producto comercial (mi jefe va a tener que pagar los 150 dólares por nada) que, según las referencias, es de lo mejor que se puede encontrar. Para crear objetos mockeados, TypeMock intercepta las llamadas al CLR (Common Language Runtime) del .NET FrameWork, y retorna valores mockeados sobre-escribiendo los valores originales completamente. Interesante… TypeMock permite crear un objeto falso (un Stub) de una forma fácil y rápida:


     MockObject myLinkA = MockManager.MockObject(typeof(SPLink));
     SPLink myLink = (SPLink)myLinkA.Object;


La primera línea crea un objeto del tipo MockObject, que por dentro tiene un objeto del tipo SPLink (de SharePoint). La segunda línea se lo entrega a un objeto de SharePoint (myLink) por medio de un cast. Esta segunda línea es necesaria para extraer el objeto de SharePoint del objeto de TypeMock, de otra forma la llamada al método que se está probando generara una excepción (mejor dicho, hay que comerse la banana sin la cascara).


Con algunos objetos de SharePoint funciona bastante bien, como es el caso con SPLink. Con muchos otros no, como por ejemplo con SPList. Después de mucho buscar, al descompilar el Microsoft.SharePoint.dll me he enterado porqué: SPLink tiene un constructor que crea valores por defecto cuando se instancia al objeto; SPList tiene un constructor a lo bárbaro, es decir, crea el objeto sin valores por defecto. Por esto, al intentar ejecutar la clase de prueba se obtiene un error de lo más bonito («Test method TestProject.gavdTest.myTitleTest threw exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —> System.NullReferenceException: Object reference not set to an instance of an object..»).


Otro problema es que no es posible cambiar los valores de propiedades en el Stub. Si después de crear el MockObject se intenta algo como:


     MockObject myListA = MockManager.MockObject(typeof(SPList));
     myListA.ExpectGet(«Title», «Hola Gustavo»);


el objeto no produce ningún error ni nada parecido, pero simplemente no cambia el valor (Title es read/write).


Conclusión: mientras las clases de SharePoint no tengan un constructor que defina valores por defecto, no se producirán más que errores con TypeMock. También la imposibilidad de cambiar los parámetros (ni siquiera los read/write) lo hace inusable.


2 – RhinoMock es gratis y bastante poderoso, y permite crear Stubs directamente:


     SPList myList = (SPList)MockRepository.GenerateStub(typeof(SPList));


que produce un error sobre un proxy que debe ser generado en alguna parte («Test method TestProject.gavdTest.myTitleTest threw exception: System.MissingMethodException: Can’t find a constructor with matching arguments —> System.MissingMethodException: Constructor on type ‘SPListProxyc05cefac21f14e41ae4fefa8c5e791da’ not found..»)


Y de todas formas es menos poderoso que TypeMock. Por ejemplo, no es posible crear mocks de clases selladas, o de interfaces privadas o de métodos no-virtuales. Una rápida mirada a las clases de SharePoint muestra que más o menos dos tercera partes de las clases son selladas, así que por este lado no vamos a llegar muy lejos.


Conclusion: mientras las clases de SharePoint sean selladas, nada de RhinoMock… por no decir nada sobre el misterioso proxy.


3 – Creando Stubs directamente. Después de mucho buscar, me he encontrado con NStub, un pequeño programa que crea Stubs directamente desde el ensamblado. La idea es bastante sencilla: crear una clase con la misma firma del ensamblado de SharePoint, algo por el estilo a:


namespace Microsoft.SharePoint
{
     public class SPLink : Object
     {

         public SPLink()
         {
         }

         private string _ServerRelativeUrl;
         public string ServerRelativeUrl
         {
         get { return _ServerRelativeUrl; }
         }
    … etc…


Y luego utilizar esta clase para instanciar el objeto a utilizar, y no la clase real de SharePoint (quitando la referencia a Microsoft.SharePoint). Mejor dicho, si vamos a falsificar el asunto, lo falsificamos de punta a punta. Lo malo es que tampoco funciona:


«Test method TestProject.gavdTest.myLinkUrlTest threw exception: System.ArgumentException:
The member specified (myLinkUrl)could not be found. You might need to re-generate your private accessor,
or the member may be private and defined on a base class. If the latter is true, you need to pass the type
that defines the member into PrivateObject’s constructor.»


El método es publico, así que ese no es el problema. La cosa va más por el problema de que el constructor que el objeto espera es diferente al constructor (vacio) que se le ha entregado. La firma del constructor original es:


    internal SPLink (SPWeb web, char cStatus, string sUrl, string sUrlParameter, Guid gWebId, Guid gFieldId)


así que si quiero agregar un constructor a mi Stub con esta firma, tengo que tener un objeto del tipo SPWeb. Como no puedo usar los objetos originales de SharePoint (los estamos falsificando, se acuerdan?), tengo que tener otro Stub para el SPWeb… y aquí se me fue la luz… o mejor dicho, la luz de la mañana apareció otra vez, y se me quitaron las ganas de continuar.


Conclusión: El camino del aventurero… funciona o no funciona? Ni idea, pero crear Stubs para las mil y pico de clases de SharePoint es trabajo de gigantes. Escribir un programita que mire con reflexión al ensamblado y me genere los Stubs automáticamente? Brillante idea (o mejor dicho, que haga algo parecido a NStub, pero más completo y con menos basura).


4 – Algo mas para intentar?:


– Crear Interfaces de las clases de SharePoint e intentar crear Mocks sobre las Interfaces? (algo así como el camino inverso: normalmente creas la Interface primero y luego las clases con la lógica, no al revés)


– Abandonar la idea? (hasta ahora he encontrado a dos personas en Internet que DICEN que han hecho Unit Tests para SharePoint, pero ninguna de las dos va mas allá de decir que lo han hecho, sin mostrar ni una letra de código)


– Irme a dormir? Buena idea…


Gustavo – http://www.gavd.net/servers/
Escriba un Comentario que me haga reir…

12 comentarios sobre “Stubs, Stubbing, Stubbers y SharePoint”

  1. «As far as the laws of mathematics refer to reality, they are not certain, as far as they are certain, they do not refer to reality.» – Albert Einstein !

    What do you think ?

  2. «As far as the laws of mathematics refer to reality, they are not certain, as far as they are certain, they do not refer to reality.» – Albert Einstein !

    what is the point of this quote ?

  3. «The fear of death is the most unjustified of all fears, for there’s no risk of accident for someone who’s dead.» [url=http://www.raypharma.com/]-[/url] Albert Einstein !

    I don’t think so! what do you think ?

  4. Приветствую всех

    один раз единожды загорелось почувствовать что-то неестественное, ну не этакое как всегда. Но, спрашивать у товарищей как-то совестно, а смотря в интернете разузнать оказалось вполне логично . Вот отсюда действиемя узнал , что [url=http://www.mashki.org]сайт знакомств[/url], на так и есть мастера отличные женщины. Они предлагают [url=http://www.mashki.org]интим[/url], при этом не просто профессионально их осуществляют , а преподносят новые чувства и восторг. в добавок сего изведал, что [url=http://www.mashki.org/devochki/statya-1]элитные проститутки[/url] предоставляют сопровождение, а мне это по работе нужно, чтобы женушка не переживала. в основном, доброкачественно, что ныне находятся сайты, в каковых можно отыскать всю сообщения, к примеру существенно проще.

    С уважением ваш друг Григорий

  5. Добрый день

    [url=http://www.megadosug.com]элитные проститутки москвы[/url] в настоящее время – предостаточно популярное действие. всего вот систем их позволение в внушительных городах, к которым Москва имеет отношение в свою очередь, превращается побольше. вот хоть, набирает в современное время признания скажем именуемый секс по вертушке. говоря иными словами теперь [url=http://www.megadosug.com]элитные девочки[/url] немедленно умеют испытать себя в « щебетании манере», попробовав утолить клиента своим всего лишь голосом. разумеется уже, парочку десятков годов назад даже человек с сверхизвращенной мыслями не мог хотя бы близко вообразить нечто похожее. любопытно, что делать после этого? Вон, [url=http://www.megadosug.com/devochki/statya-1]элитные девушки москвы[/url] отсиживаются без работы. вероятно что-либо нужно домыслить и про них?

    С уважением ваш друг Мирон

Responder a anonymous Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *