如何使用静态方法(UnitOfWork case)moq静态类?

Att*_*lah 11 .net c# moq mocking

我有这些课程:

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么能嘲笑类UnitOfWorkSSunitOfWork

Jos*_*osh 9

看起来你在调用Begin()时唯一要做的就是为特定的接口返回你配置的类: IUnitOfWork

你真的需要确保你对Begin()的调用返回一个模拟实现 IUnitOfWork

您可以通过以下两种方式之一:

选项一 - 重构,UnitOfWorkSS以便您可以设置IUnitOfWork要返回的实例

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
}
Run Code Online (Sandbox Code Playgroud)

选项二 - 只需IUnitOfWork在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
}
Run Code Online (Sandbox Code Playgroud)