2011-10-26 19 views
6

Estoy tratando de burlarme de la clase SearchResultCollection. Sin embargo, cuando intento de interceptar una llamada al captador PropertiesLoaded, mi prueba se emite una excepción:Moq C# construido en la clase

System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: x => x.PropertiesLoaded 

Mi Código:

Mock<SearchResultCollection> searchResultMock = new Mock<SearchResultCollection>(); 

// Set up collection that will be returned 
string[] tempData = { "one", "two" }; 
searchResultMock.SetupGet(x => x.PropertiesLoaded).Returns(tempData); 

Alguien ha burlado con éxito una clase como esta? La propiedad en cuestión solo tiene un getter y no es virtual.

// 
    // Summary: 
    //  Gets the System.DirectoryServices.DirectorySearcher properties that were 
    //  specified before the search was executed. 
    // 
    // Returns: 
    //  An array of type System.String that contains the properties that were specified 
    //  in the System.DirectoryServices.DirectorySearcher.PropertiesToLoad property 
    //  collection before the search was executed. 
    public string[] PropertiesLoaded { get; } 
+0

posible duplicado de [? Por qué no puedo burlarse MouseButtonEventArgs.GetPosition() con Moq] (http://stackoverflow.com/questions/1918208/why-cant-i-mock-mousebuttoneventargs-getposition-with-moq) – TrueWill

Respuesta

8

Me temo que no puedes.

Como ha dicho, la propiedad no es virtual. Otra opción habría sido burlar la interfaz, pero lo verifiqué y no hay ninguno para esta clase (según el documento de MSDN).

Existen otros marcos de aislamiento que pueden hacerlo. Microsoft Moles puede hacerlo, al igual que TypeMock.


Microsoft Moles: http://research.microsoft.com/en-us/projects/moles/

Typemock: http://www.typemock.com/

+0

Sí, cualquiera de esos marcos de aislamiento funcionaría para esto. – scottheckel

2

Esto no es posible con Moq. Solo puede simular interfaces, clases abstractas y clases con métodos virtuales (y en este último caso, solo puede usar Configuración() para simular el comportamiento de los métodos virtuales).

+0

En este caso, me veo forzado a escribir funciones/objetos proxy para interceptar llamadas a las funciones que quiero llamar. Gorrón. – MarkP