2010-11-26 9 views
11

tengo estas clases:Cómo moq una clase estática con un método estático (caso UnitOfWork)?

public static class UnitOfWorkSS 
{ 
    public static IUnitOfWork Begin() 
    { 
    return IoC.Resolve<IUnitOfWork>(); 
    } 
} 

public class PostService 
{ 
    using (IUnitOfWork unitOfWork = UnitOfWorkSS.Begin()) 
    { 
    //don't forget to sanitize html content 
    htmlContent = _htmlSanitizer.Sanitize(htmlContent); 

    IPost post = _factory.CreatePost(byUser, title, htmlContent);      

    _postRepository.Add(post); 

    unitOfWork.Commit(); 
    } 
} 

Como puedo burlarse de las clases UnitOfWorkSS y unitOfWork?

Respuesta

9

Parece que lo único que está haciendo con la llamada a Comenzar() regresa a su clase configurada para esa interfaz en particular: IUnitOfWork

Realmente sólo tiene que asegurarse de que su llamada a Begin() devuelve una aplicación simulada de IUnitOfWork

una de las dos maneras que usted puede hacer esto:

Opción uno - Refactor UnitOfWorkSS de manera que se puede establecer la instancia de IUnitOfWork a devolver

public static class UnitOfWorkSS 
{ 
    private static IUnitOfWork _unitOfWork; 
    public static IUnitOfWork UnitOfWork 
    { 
     set { _unitOfWork = value; } 
     private get{ _unitOfWork ?? (_unitOfWork = IoC.Resolve<IUnitOfWork>()); } 
    } 

    public static IUnitOfWork Begin() 
    { 
     return UnitOfWork; 
    } 
} 

[TestMethod] 
public void DoStuff() 
{ 
    var mockUnitOfWork = new Mock<IUnitOfWork>(); 
    UnitOfWorkSS.UnitOfWork = mockUnitOfWork.Object; 

    //Do some setup and verify 
} 

Opción dos - Sólo tiene que registrar una instancia de simulacro de IUnitOfWork con su IoC Container

private Mock<IUnitOfWork> _mockUnitOfWork; 

[TestInitialize] 
public void Init() 
{ 
    _mockUnitOfWork = new Mock<IUnitOfWork>(); 

    //Making a lot of assumptions about your IoC here... 
    IoC.Register<IUnitOfWork>(_mockUnitOfWork.Object); 
} 

[TestMethod] 
public void DoStuff() 
{ 
    _mockUnitOfWork.Setup(...); 

    //Do some verification 
} 
+0

La opción 2 me parece mejor teniendo en cuenta que la opción 1 introduce el estado en una clase estática solo por el hecho de hacerlo comprobable; sin embargo, tal vez eso es todo lo que el OP está buscando. – aaaaaa

1

Por lo que yo sé, no puede simular clases o métodos estáticos.

+0

Sí, me di cuenta de eso. pero la cosa es que necesito fingir esa funcionalidad, ¿hay alguna manera de hacerlo? – Attilah

+0

Tendría que reescribir su unidad de trabajo para que no sea estática, hasta donde yo sé. – Chris

2

Simula el IUnitOfWork y regístrelo en su contenedor para que se pueda resolver.

0

Comprendo que esto es una pregunta muy antigua, pero en caso de que alguien termina aquí ...

La mejor solución es un cambio de diseño como dicen las otras respuestas. Sin embargo, si eso no es posible, puede usar Microsoft Fakes (que reemplazó a Moles) o, si prefiere no depender de Visual Studio, hay una biblioteca llamada Smocks que puede ayudar.

https://github.com/vanderkleij/Smocks

Cuestiones relacionadas