c# - 如何用静态方法最小化静态类(UnitOfWork 案例)?

标签 c# .net mocking moq

我有这些类(class):

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

最佳答案

看起来您在调用 Begin() 时所做的唯一一件事就是返回为该特定接口(interface)配置的类: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
}

选项二 - 只需在您的 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
}

关于c# - 如何用静态方法最小化静态类(UnitOfWork 案例)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4282415/

相关文章:

c# - 监控 C# 方法性能的工具

c# - 以编程方式有选择地禁用 Windows 上特定程序的 UAC

c# - 程序员说 "Code against an interface, not an object."是什么意思?

javascript - 从主方法调用并包含 http 请求授权的子方法的单元测试

android - 机器人 3 : Shadow custom class

c# - 为什么构造函数中不允许类型参数?

c# - EF 代码优先 - 复合键

c# - 在 WinForms 中控制嵌套限制

.net - Visual Studio 扩展的动态热键

unit-testing - 无法在Grails中模拟Thrift类进行测试(GroovyCastException)