2012-10-01 5 views
8

Estoy usando Microsoft Fakes en algunas pruebas de unidad en las que estoy trabajando. Mi interfaz se parece a esto:¿Cómo se hace referencia a un stub que tiene un parámetro genérico de sí mismo que utiliza Microsoft Fakes?

interface ISecuredItem<TChildType> where TChildType : class, ISecuredItem<TChildType> 
{ 
    SecurityDescriptor Descriptor { get; } 
    IEnumerable<TChildType> Children { get; } 
} 

Una aplicación típica de este aspecto:

class RegistryKey : ISecuredItem<RegistryKey> 
{ 
    public SecurityDescriptor Descriptor { get; private set; } 
    public IEnumerable<RegistryKey> Children { get; } 
} 

me gustaría utilizar esta interfaz con Microsoft falsificaciones, y tienen que generar un talón para mí. El problema es que el formulario que utiliza Fakes es StubInterfaceNameHere<>, por lo que en el ejemplo anterior, usted intenta hacer algo como StubISecuredItem<StubISecuredItem<StubISecuredItem<StubISecuredItem....

¿Esto es posible? Si es así, ¿cómo utilizo las falsificaciones de esta manera?

Respuesta

5

Después de algunos experimentos encontré una solución de trabajo, aunque no es la más elegante.

Este es su código normal:

public interface ISecuredItem<TChildType> 
    where TChildType : ISecuredItem<TChildType> 
{ 
    SecurityDescriptor Descriptor { get; } 
    IEnumerable<TChildType> Children { get; } 
} 

En el proyecto de prueba se crea una interfaz StubImplemtation

public interface StubImplemtation : ISecuredItem<StubImplemtation> { } 

Luego, en la prueba de unidad que puede hacer lo siguiente:

var securedItemStub = new StubISecuredItem<StubImplemtation> 
          { 
           ChildrenGet =() => new List<StubImplemtation>(), 
           DescriptorGet =() => new SecurityDescriptor() 
          }; 

var children = securedItemStub.ChildrenGet(); 
var descriptor = securedItemStub.DescriptorGet(); 

Puede omitir el StubImplementation completo y usar RegistryKey si eso es n o problema

+0

Esto definitivamente hará el truco, pero requiere implementar la interfaz como un stub/mock en el proyecto de prueba. No sé si esa es la idea ... –

+0

Me imagino que no es la idea ... pero no pude ver ninguna otra solución. Cuando mira el código fuente que genera el marco Fakes, el parámetro genérico es del tipo ISecuredItem, no de StubISecuredItem. Casi diría que es un error en el marco. Y la implementación en el proyecto de prueba puede hacer que todos los métodos arrojen una NotImplementedException, por lo que no debería costar demasiado tiempo crearla. –

+0

Yo kno, estoy totalmente de acuerdo. La solución de respuesta que automáticamente se me vino a la mente es la que mencionaste. –

Cuestiones relacionadas