2015-09-05 192 views
1

我有如下类别:如何使用Moq来模拟内部类保护的方法?

public class TestService 
{ 
    public void Upload() 
    { 
     var manager = new Manager(); 
     var worker = manager.CreateWorker(); 
     worker.DoWork(); 
    } 
} 

public class Manager 
{ 
    public Worker CreateWork() 
    { 
     return new Worker(); 
    } 
} 

public class Worker() 
{ 
    public void DoWork() 
    { 
     SetupEnvironment(); 
     //some codes here... 
    } 

    protected virtual void SetupEnvironment() 
    { 
     //some codes here ... 
    } 
} 

我想用最小起订量来创建一个上传单元测试(在TestService的类)的方法,以及工人的SetupEnvironment()方法应该嘲笑起来。我试过下面的代码,但它不起作用:

[TestMethod] 
public void Upload_Test() 
{ 
     var mockWorker = new Mock<Worker>(); 
     mockWorker .Protected().Setup<string>("SetupEnvironment").Returns(() => 
     { 
      //some dummy code here ... 
     }); 

     var service = new TestService(); 
     service.Upload(); 
     Assert.IsTrue(true); 
    } 

任何人都知道如何使上述单元测试代码工作?

+1

您的模拟对象是可以的,但是您的测试方法使用的是真实的对象而不是假的对象。这就是问题.... –

回答

0

有些事情需要改变。请参阅下面的类TestServiceWorker的代码。

public class TestService 
{ 
    private readonly Manager _manager; 

    public TestService(Manager manager) 
    { 
     _manager = manager; 
    } 

    public void Upload() 
    { 
     var worker = _manager.CreateWorker(); 
     worker.DoWork(); 
    } 
} 

public class Manager 
{ 
    public virtual Worker CreateWorker() 
    { 
     return new Worker(); 
    } 
} 

public class Worker 
{ 
    public void DoWork() 
    { 
     SetupEnvironment(); 
     //some codes here... 
    } 

    protected virtual void SetupEnvironment() 
    { 
     //some codes here ... 
    } 
} 

然后测试可能看起来像这样。方法SetupEnvironmentvoid,因此设置无法返回任何值,您还需要模拟Manager并将其传递给TestService。通过构造函数注入所以你可以注入你的模拟对象。 HTH

[TestMethod] 
public void Upload_Test() 
{ 
    bool setupEnvironmentWasCalled = false; 

    Mock<Worker> mockWorker = new Mock<Worker>(); 
    mockWorker.Protected().Setup("SetupEnvironment") 
     .Callback(() => 
     { 
      //some dummy code here ... 
      setupEnvironmentWasCalled = true; 
     }); 

    Mock<Manager> mockManager = new Mock<Manager>(); 
    mockManager.Setup(m => m.CreateWorker()) 
     .Returns(mockWorker.Object); 

    var service = new TestService(mockManager.Object); 
    service.Upload(); 
    Assert.IsTrue(setupEnvironmentWasCalled); 
} 
相关问题