2009-03-17 7 views

Respuesta

7

Las clases y métodos estáticos son realmente difíciles de trabajar en las pruebas unitarias (que es una de las razones por las que trato de evitarlos). En este caso, probablemente desarrollaría un envoltorio alrededor de la clase estática, que contiene solo los métodos que uso. Luego utilizaría mi clase de contenedor en lugar de la clase real. La clase contenedora se construiría de modo que sea fácil de simular.

Ejemplo (tipo de) uso de RhinoMocks. Tenga en cuenta que utiliza la inyección de dependencia para dar a la clase bajo prueba una copia del contenedor. Si el contenedor proporcionado es nulo, crea uno.

public class MyClass 
{ 
    private VPU_Wrapper VPU { get; set; } 

    public MyClass() : this(null) {} 

    public MyClass(VPU_Wrapper vpu) 
    { 
     this.VPU = vpu ?? new VPU_Wrapper(); 
    } 

    public string SomeMethod(string path) 
    { 
     return this.VPU.ToAbsolute(path); 
    } 
} 

public class VPU_Wrapper 
{ 
    public virtual string ToAbsolute(string path) 
    { 
     return VirtualPathUtility.ToAbsolute(path); 
    } 
} 

[TestMethod] 
public void SomeTest() 
{ 
    string path = "~/path"; 
    string expected = "/app/path"; 

    var vpu = MockRepository.GenerateMock<VPU_Wrapper>(); 
    vpu.Expect(v => v.ToAbsolute(path)).Return(expected); 

    MyClass class = new MyClass(vpu); 

    string actual = class.SomeMethod(path); 

    Assert.AreEqual(expected, actual); 

    vpu.VerifyAllExpectations(); 
} 
+1

+1 para envolverlo, que decía que yo prefiero declarar explícitamente una interfaz para la materia me burlaré de esa manera – eglasius

+0

@Freddy - que a menudo utilizan una interfaz también. – tvanfosson

15

Estamos mucho más allá de VS 2008, pero para cualquier persona que todavía está luchando con este tema, he encontrado una solución en: http://forums.asp.net/t/995143.aspx?Mocking+HTTPContext+object.

Use el siguiente código en su inicio de prueba para anular los valores predeterminados de AppDomain. (Los métodos estáticos VirutalPathUtility utilizarán sus nuevos valores.)

[TestInitialize] 
public void Initialize() 
{ 
    // Fake out env for VirtualPathUtility.ToAbsolute(..) 
    string path = AppDomain.CurrentDomain.BaseDirectory; 
    const string virtualDir = "/"; 
    AppDomain.CurrentDomain.SetData(".appDomain", "*"); 
    AppDomain.CurrentDomain.SetData(".appPath", path); 
    AppDomain.CurrentDomain.SetData(".appVPath", virtualDir); 
    AppDomain.CurrentDomain.SetData(".hostingVirtualPath", virtualDir); 
    AppDomain.CurrentDomain.SetData(".hostingInstallDir", HttpRuntime.AspInstallDirectory); 
    TextWriter tw = new StringWriter(); 
    HttpWorkerRequest wr = new SimpleWorkerRequest("default.aspx", "", tw); 
    HttpContext.Current = new HttpContext(wr); 
} 
+4

Lo había notado al principio. Cada vez que hice una búsqueda sobre el tema, esta publicación siguió apareciendo, así que pensé que sería relevante para las herramientas actuales. –

+0

Estamos autorizados a compartir conocimientos en un estilo de preguntas y respuestas aquí. En particular, podría hacer una pregunta por separado para las herramientas de 2013, y proporcionar lo anterior como su respuesta. Normalmente no lo recomiendo para los nuevos usuarios de [so]. No estoy seguro de que puedas hacer eso con un "1" representante. Pero podría ser apropiado hacer eso. –

+2

+1: La forma en que se titula la pregunta, Google siempre devolverá esto como un éxito superior. Entonces es una buena idea improvisar las respuestas. Lo siento, pero no creo que pueda estar de acuerdo con el razonamiento downvote. Esta no es la respuesta aceptada y eso es suficiente. – Mrchief

3

Uso de Microsoft falsificaciones que se puede fingir ToAbsolute Método VirtualPathUtility fácilmente.

  1. Examinar System.Web en References> Right Click> Add Fakes Assembly.

Uso siguiente código

using Microsoft.QualityTools.Testing.Fakes; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using System.Web.Fakes; 

public class TestCode 
    { 
     [TestMethod] 
     public void TestSummaryTabLinks() 
     { 
      using (ShimsContext.Create()) 
      { 
       //Fake VirtualPathUtility ToAbsolute method to Work properly in case of Unit Test Project 
       //For Finding Relative url. 
       ShimVirtualPathUtility.ToAbsoluteString = (string s) => { return s; }; 

       MyClass class = new MyClass(vpu); 

       string actual = class.SomeMethod(path); 

       Assert.AreEqual(expected, actual); 

      } 
     } 

} 
+1

Esta no es una respuesta a la pregunta: la pregunta es explícita sobre VS2008, que no tenía falsificaciones. –

Cuestiones relacionadas