2010-11-26 140 views
11

我有这些类:如何用静态方法来调用静态类(UnitOfWork case)?

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

我怎么能嘲笑类UnitOfWorkSSunitOfWork

回答

9

它看起来像你与呼叫做开始()将返回您配置类特定接口的唯一的事情:IUnitOfWork

你真的只需要确保你的电话开始()返回模拟实现的IUnitOfWork

一两种方法可以做到这一点:

方案一 - 重构UnitOfWorkSS,使您可以设置实例将返回

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 
} 

方案二 - 只要你的IoC容器注册的IUnitOfWork一个模拟实例

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 
} 
1

据我所知,你不能嘲笑静态类或方法。

+0

是的,我意识到这一点。但事情是,我需要伪造该功能,有没有办法做到这一点? – Attilah 2010-11-26 03:58:17

+0

就我所知,你必须重写你的工作单元的东西是非静态的。 – Chris 2010-11-26 04:00:04

2

模拟IUnitOfWork并将其注册到您的容器中,以便可以解决它。

0

我意识到这是一个非常古老的问题,但如果有人在这里结束了...

最好的解决方案是像其他答案说的设计更改。但是,如果这是不可能的,你可以使用Microsoft Fakes(取代Moles),或者,如果你不想依赖Visual Studio,那么有一个叫做Smocks的库可以提供帮助。

https://github.com/vanderkleij/Smocks