2010-11-26 169 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