2015-09-05 75 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); 
} 
相關問題