2011-10-25 33 views
0

在許多情況下,我寫有受保護的虛擬方法的代碼提供接縫(協助單元測試):如何提供一個乾淨實現的接縫

public class TemporaryStorage  
{ 
    public TemporaryStorage() 
    { 
    this.RootPath = Path.Combine(this.GetEnvironmentPath, Path.GetRandomFileName()); 
    } 
    public string RootPath { get; private set; } 
    protected virtual string GetEnvironmentPath 
    { 
     get { return LocalStorage.GetEnvironmentPath(); } 
    } 
} 

然後,在測試套件,我將從該類派生併爲GetEnvironmentPath()提供自定義實現。

而不是在測試套件內創建派生類,是一種更好的方法嗎?我可以使用MOQ完成相同的結果(爲GetEnvironmentPath提供替代實現)嗎?

問候,

回答

1

模擬被測試類的最簡單方法是使用接口。當測試你的類實現某個接口,那麼你可以簡單地使用起訂量是這樣寫的一個模擬:

比方說,你有這樣的一個接口:

private interface IMyInterface 
{ 
    string MyMethod(int value); 

    int MyProperty { get; set; } 
} 

然後,你可以配置嘲笑這樣的:

var mockedObject = new Mock<IMyInterface>(); 
mockedObject.Setup(x => x.MyMethod(It.IsAny<int>())).Returns<int>(value => value.ToString()); 
mockedObject.SetupGet(x => x.MyProperty).Returns(42); 

您可以訪問你的嘲笑對象在單元測試中這樣說:

DoSomething(mockedObject.Object);