2013-02-21 65 views
0

我發現如果從類繼承它,測試類會更容易。 考慮這個seudo例如:Unittest通過Dispose繼承目標(SUT)

public class Bizz 
    { 
    public void Do() 
    { 
     var obj = ExtenOutOfTest(); 
     someList.Add(obj); 
    } 

    protected List<ISomeObejct> someList = new ISomeObejct<ISomeObejct>(); 

    protected virtual ISomeObejct ExtenOutOfTest() 
    { 
    //return real obejct 
    } 
    } 

和測試是這樣的:

[TestClass] 
    public class BizzTest : Bizz 
    { 
    private ISomeObejct _fakedObj; 

    protected override ISomeObejct ExtenOutOfTest() 
    { 
     return _fakedObj; 
    } 

    [TestMethod] 
    public void Test_Do_Add() 
    { 
     _fakedObj = new Fake<ISomeObejct>().FakedObject; 

     Assert.IsFalse(someList.Any()); 
     base.Do(); //<-- target 
     Assert.IsTrue(someList.Any()); 
    } 
    } 

現在我有我的測試,我BIZZ對象不到風度隔離能力暴露任何其他除了這些方法之外的方法應該是。

這種單元測試不好的做法嗎?

當我修改我的Bizz類實現IDisposable我無法再運行我的測試:

~Bizz(){Dispose(false);} 

public void Dispose() 
{ 
    Dispose(true); 
} 

private void Dispose(bool disposing) 
{ 
    if(!disposing) return; 
    //do cleanup resources 
} 

它不會顯示我失敗之前甚至開始: 單元測試適配器拋出異常:曖昧找到匹配。

我試圖讓Dispose虛擬,然後在測試類中覆蓋它 - 但它不起作用。

任何幫助表示讚賞。

回答

1

使用所述的標準配置模式,例如在http://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.100).aspx中修復了此問題。也就是說,用protected void Dispose(bool disposing)...代替private void Dispose(bool disposing)...

這個問題與MSTest(我測試過的Visual Studio 2010和2013)確實在每次測試之後在測試類上調用dispose有關。爲此,MSTest查詢所有public void Dispose函數,但不幸的是忽略了參數,它是函數簽名的一部分,區分了兩個變體。因此,MSTest與Ambiguous match found一起存在。

+0

解釋它 - 謝謝 – 2014-07-12 06:30:53

0

failer的原因仍然是一個謎。但是這似乎fixet起來:

void IDisposable.Dispose() 
{ 
    GC.SuppressFinalize(this); 
    Dispose(true); 
} 

private void Dispose(bool disposing) 
{ 
    //actual cleanup omitted 
} 

注意到界面現在implermented顯式+實際的清理方法Dispose(bool disposing)由私人。