Propriedade estática de simulação com moq

Eu sou muito novo para usar o moq . Eu estou em criar algum caso de teste de unidade para o HttpModule e tudo funciona bem até eu acertar uma propriedade static seguinte forma

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

Eu não sei como criar mocks para class static e propriedade como HttpRuntime.AppDomainAppVirtualPath . O context , request e response foram ridicularizados bem com o código de amostra que recebo do moq. Eu apreciarei se alguém puder me ajudar nisso.

O Moq não pode falsificar membros estáticos.

Como uma solução, você pode criar uma class wrapper (Padrão do Adaptador) mantendo a propriedade static e falsificar seus membros.
Por exemplo:

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

No código de produção, você pode acessar essa class em vez de HttpRuntime e falsificar essa propriedade:

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

Outra solução é usar a estrutura Isolation (como Typemock Isolator ) na qual você pode falsificar classs e membros estáticos.
Por exemplo:

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

Disclaimer – Eu trabalho na Typemock

Você não pode Moq methods estáticos com Moq.

Isso não é uma coisa ruim na realidade, methods estáticos e classs têm seu lugar, mas por lógica eles dificultam o teste de unidade. Naturalmente você vai encontrá-los quando usar outras bibliotecas. Para contornar isso, você precisará escrever um adaptador (wrapper) em torno do código estático e fornecer uma interface. Por exemplo:

 // 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(); } 

Note que omiti a class concreta que usa o IStatic para o código de produção. Tudo o que seria uma class que usa IStatic e seu código de produção usaria essa class, em vez de StaticClass acima.

Então com o Moq:

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

Como mencionado nas respostas anteriores, não é possível usar o MoQ em methods estáticos e, se necessário, sua melhor ideia é criar um wrapper em torno da class estática.

No entanto, algo que descobri recentemente é o projeto Moles . Da homepage; “Moles permite replace qualquer método .NET por um delegado. As Moles suportam methods estáticos ou não virtuais.” Pode ser útil para sua situação atual.

A melhor solução que encontrei até agora é o JustMock da Telerik – infelizmente apenas a versão paga permite a zombaria da estática.

Embora a idéia de envolver a estática seja boa – você nem sempre pode fazer isso. Se você quiser testar algum código que já usa algumas classs estáticas, nem sempre é possível trocar e usar um wrapper. Neste caso, o JustMock parece uma solução razoável e provavelmente vou usá-lo em algumas soluções em um futuro próximo.

Você pode usar o Microsoft Fakes para isso. Isso definitivamente resolverá o problema. Consulte https://msdn.microsoft.com/pt-br/library/hh549175.aspx