Simulacro de propiedad estática con moq

Soy bastante nuevo para usar moq . Estoy en crear un caso de prueba unitaria para HttpModule y todo funciona bien hasta que toco una propiedad static siguiente manera

 this.applicationPath = (HttpRuntime.AppDomainAppVirtualPath.Length > 1) ? HttpRuntime.AppDomainAppVirtualPath : String.Empty; 

No sé cómo crear burlas para clases static y propiedades como HttpRuntime.AppDomainAppVirtualPath . El context , la request y la response se han burlado bien con el código de muestra que recibo de moq. Apreciaré si alguien puede ayudarme en esto.

Moq no puede falsificar miembros estáticos.

Como solución, puede crear una clase contenedora (Patrón de adaptador) que contenga la propiedad estática y falsifique sus miembros.
Por ejemplo:

 public class HttpRuntimeWrapper { public virtual string AppDomainAppVirtualPath { get { return HttpRuntime.AppDomainAppVirtualPath; } } } 

En el código de producción, puede acceder a esta clase en lugar de HttpRuntime y falsificar esta propiedad:

 [Test] public void AppDomainAppVirtualPathTest() { var mock = new Moq.Mock(); mock.Setup(fake => fake.AppDomainAppVirtualPath).Returns("FakedPath"); Assert.AreEqual("FakedPath", mock.Object.AppDomainAppVirtualPath); } 

Otra solución es utilizar el marco de aislamiento (como Typemock Isolator ) en el que puede falsificar clases estáticas y miembros.
Por ejemplo:

 Isolate.WhenCalled(() => HttpRuntime.AppDomainAppVirtualPath) .WillReturn("FakedPath"); 

Descargo de responsabilidad – Yo trabajo en Typemock

No puede Moq métodos estáticos con Moq.

Esto no es malo en realidad, los métodos y clases estáticos tienen su lugar, pero por lógica dificultan las pruebas unitarias. Naturalmente, te encontrarás con ellos cuando uses otras bibliotecas. Para evitar esto, deberá escribir un adaptador (envoltorio) alrededor del código estático y proporcionar una interfaz. Por ejemplo:

 // Your static class - hard to mock class StaticClass { public static int ReturnOne() { return 1; } } // Interface that you'll use for a wrapper interface IStatic { int ReturnOne(); } 

Tenga en cuenta que he omitido la clase concreta que usa IStatic para el código de producción. Todo lo que sería es una clase que utiliza IStatic y su código de producción haría uso de esta clase, en lugar de StaticClass anterior.

Entonces con Moq:

 var staticMock = new Mock(); staticMock.Setup(s => s.ReturnOne()).Returns(2); 

Como se mencionó en las respuestas anteriores, no puede usar MoQ en métodos estáticos, y si lo necesita, su mejor opción es crear un contenedor alrededor de la clase estática.

Sin embargo, algo que he descubierto recientemente es el proyecto Moles . Desde la página de inicio; “Moles permite reemplazar cualquier método .NET con un delegado. Moles admite métodos estáticos o no virtuales”. Puede ser útil para su situación actual.

La mejor solución que he encontrado hasta ahora es JustMock de Telerik: desafortunadamente, solo la versión paga permite la burla de la estática.

Si bien la idea de envolver la estática es buena, no siempre se puede hacer esto. Si desea probar algún código que ya usa algunas clases estáticas, no siempre es posible cambiar y usar un contenedor. En este caso, JustMock parece una solución razonable y probablemente la use en algunas soluciones en el futuro cercano.

Puedes usar Microsoft Fakes para esto. Definitivamente resolverá el problema. Consulte https://msdn.microsoft.com/en-us/library/hh549175.aspx