2015-04-22 78 views
1

說我有像服務,以便:現在單元測試嵌套方法

public class MyService : IMyService 
{ 
    public void DoStuff(IDependency dependency, string value) 
    { 
     dependency.SomeMethod(value, true); 
     DoOtherStuff(dependency); 
    } 

    public void DoOtherStuff(IDependency dependency) 
    { 
     // do some stuff 
    } 
} 

,當單元測試MyService,我可以模擬的依賴性足夠容易地和測試被適當地使用的依賴性:

public void MyServiceTest() 
{ 
    // Arrange 
    var mockDependency = new Mock<IDependency>(); 
    mockDependency.Setup(m => m.SomeMethod()); 
    var service = new MyService(); 

    // Act 
    service.DoStuff(mockDependency.Object, "value"); 

    // Assert 
    mockDependency.Verify(v => v.SomeMethod(), Times.Once); 
} 

如何測試服務電話DoOtherStuff?或者這是一種不好的模式?什麼是正確的方法來做到這一點?

回答

2

你不應該對單元測試怎麼在意特定的公共功能,只要它滿足其合同執行。

注意:上面的「公共」一般用於「外部可用」,通常它與C#public一致,但有時候您需要/必須將其他方法標記爲公共,即使它不是外部合同的一部分。

如果你真的必須測試DoOtherStuff被調用,你可以使用該方法virtual並使用測試實現提供它自己的版本,以某種方式通知你關於該調用(可能Moq也可以爲你創建一個)。

2

對您想要使用MOQ另一個類,如寫的。

然而,類測試,我認爲你不應該在您的測試兩種方法分離出來,爲您不要測試私有方法類似的原因。如果代碼被重構,以至於如果測試失敗,則不會調用第二個方法。不,公共API不受影響。

更好地做出關於應該發生依賴性,DoOtherStuff被調用,因爲你現在做什麼斷言。

+0

作爲一個說明(故意在回答身體不把),如果該方法是虛擬的,你可以在您的測試覆蓋它們。但是,我不認爲這在大多數情況下是非常有用的。我認爲我們爲什麼關心某些事情的核心是Times.Once,因爲它是類之間的交互。另外'Delegate.CreateDelegate數據(Metadata >等etc'。也有黑暗的一面的方式,但我不是非常熟悉。 –