visual valid method example documentacion description cref comment comentarios c# unit-testing moq microsoft-sync-framework

valid - method summary c#



Burlándose de un tipo con un constructor interno usando Moq (4)

Estoy tratando de burlar una clase del Microsoft Sync Framework. Solo tiene un constructor interno. Cuando intento lo siguiente:

var fullEnumerationContextMock = new Mock<FullEnumerationContext>();

Me sale este error:

System.NotSupportedException: el padre no tiene un constructor predeterminado. El constructor predeterminado debe definirse explícitamente.

Esta es la traza de pila:

System.Reflection.Emit.TypeBuilder.DefineDefaultConstructorNoLock (Estado de los atributos de los atributos de los atributos) System.Reflection.Emit.TypeBuilder. DynamicProxy.Generators.Emitters.AbstractTypeEmitter.BuildType () Castle. DynamicProxy.ProxyGenerator.CreateClassProxyType (Tipo classToProxy, Tipo [] adicionalInterfacesToProxy, ProxyGenerationOptions opciones) Castle.DynamicProxy.ProxyGraficatorPlacerPlacerPlacosPlacosPlacosPlacosPlacosPlacosClasePlacosPlacosClasePlacosPlacosClasePlacosPlacosPlacosAparteClassProPlaticidadClasePlacosPlacosPlacaCasaProyectoClasePlazoPlacaPlacaPlacaPlacaPlacaPlacaPlacaPlazo ProxyGenerator.Create ClassProxy (tipo classToProxy, tipo [] AdditionalInterfacesToProxy, ProxyGenerationOptions opciones, IInterceptor [] interceptores) Castle.DynamicProxy.ProxyGenerator.CreateClassProxy (tipo classToProxy) en el tipo de fiesta / departamento en el interior de la piscina (tipo de clase 1.<InitializeInstance>b__0() Moq.PexProtector.Invoke(Action action) Moq.Mock 1.InitializeInstance ()

¿Cómo puedo trabajar alrededor de esto?


Basándome en las respuestas de , he creado una interfaz ( IFullEnumerationContext ) que IFullEnumerationContext y luego tengo dos sobrecargas del método que estoy intentando probar, una que toma el FullEnumerationContext y otra que toma el IFullEnumerationContext . No se siente bien, pero funciona. Cualquier mejor sugerencia o mejora sería bienvenida.

public override void EnumerateItems(FullEnumerationContext context) { List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon(); context.ReportItems(listItemFieldDictionary); } public void EnumerateItems(IFullEnumerationContext context) { List<ItemFieldDictionary> listItemFieldDictionary = EnumerateItemsCommon(); context.ReportItems(listItemFieldDictionary); }


En realidad se puede. Abra su archivo AssemblyInfo.cs y agregue la siguiente línea al final,

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]


No puede simular un tipo que no tiene un constructor público porque Moq no podrá crear una instancia de un objeto de ese tipo. Dependiendo de lo que está intentando probar, tiene algunas opciones:

  1. Si hay un objeto de fábrica o alguna otra forma de obtener instancias de FullEnumerationContext, puede usarlo (lo siento, no estoy familiarizado con el marco de sincronización)
  2. Podría usar la reflexión privada para crear una instancia de FullEnumerationContext, pero entonces no podría simular métodos en él.
  3. Podría introducir una interfaz y / o un objeto contenedor que sea simulacro que el código bajo prueba podría invocar. La implementación en tiempo de ejecución se delegaría al FullEnumerationContext real, mientras que su implementación en tiempo de prueba ejecutaría cualquier acción que necesite.

No soy realmente un experto en Moq, pero creo que necesitas especificar los argumentos para el constructor. En Rhino Mocks los especificarías así:

var fullEnumerationContextMock = new Mock<FullEnumerationContext>(arg1, arg2);

Probablemente sea similar en Moq.