2015-08-14 43 views
3

我們有一個共享的基本接口public interface IOperation {...}以及實現IOperation的很多(幾十個,很快100多個)不同的對象。內部結構,內部結構可見性和測試共享行爲

我們還對所有這些實現進行了測試,所有這些實現都從基類TestOperationCommon繼承,這些基類使用Create方法的實際操作類和類型模板化爲new這樣的操作。我們爲TestOperationCommon實現了一個最多五個模板參數(這對所有操作都足夠了)。

現在,最近決定將所有操作實現內部公開,只有IOperation公開,這似乎是一個好主意,因爲這些操作是實現細節。與[InternalsVisibleTo(...)]測試似乎也解決了。

不過,現在我明白了,我們不能再使用我們的測試結構,類屬參數給公衆測試類現在內部的(至少在測試實際的類),這導致

Inconsistent Accessibility .... less accessible than ...

錯誤。下面的代碼中,一個公共測試類不能從TestOperationCommon繼承,並且具有內部通用參數T.但是將所有這些共享行爲測試複製到特定測試中似乎也不是一個好主意。

  • 有沒有辦法讓vstest框架(VS2013 +)來測試[TestClass] ES是內部?

  • 或者還有另外一種方法,我們可以保持共享測試而不必複製大量代碼?或者我們是否做錯了(使這些'實現細節類'內部)?

代碼示例作爲評論的請求:

public interface IOperation { ... } 

internal class SomeOperation : IOperation 
{ 
    public SomeOperation(A a, B b, C c) {...} 
} 


public abstract TestOperationCommon<T, A, B, C> 
    where T : IOperation 
    where ... 
{ 
    protected abstract T Create(A a, B b, C c); 

    [TestMethod] 
    public void TestCommonOperationBehavior() 
    { 
     var op = Create(Mock.Of<A>(), Mock.Of<B>(), Mock.Of<C>); 
     ... 
    } 
} 

[TestClass] 
public class TestSomeOperation : TestOperationCommon<SomeOperation, ...> 
{ 
    [TestMethod] 
    public void TestSpecificSomeOperationStuff() {} 

} 
+0

與小代碼示例將有很大的幫助 – Backs

+0

嗯,這麼大的重構通常的觀點是大幅降低了測試工作。因爲測試任何正常客戶端代碼無法使用的東西都沒有意義。 –

回答

1

你能創建一個測試包裝類?

喜歡的東西:

[TestClass] 
public class AnnoyingTestSomeOperationWrapper 
{ 

    [TestMethod] 
    public void TestSpecificSomeOperationStuff() 
    { 
     new TestSomeOperation().TestSpecificSomeOperationStuff() 
    } 

} 

internal class TestSomeOperation : TestOperationCommon<SomeOperation, ...> 
{ 
    public void TestSpecificSomeOperationStuff() {} 

} 
+0

我試過了,主要的問題是要麼它很醜,要麼我們沒有很好的測試失敗信息。如果我們轉發全部六種方法(每種方法都在自己的[TestMethod]中),那麼我們有很多重複的方法。如果我們只創建一個調用所有共享方法的方法,那麼我們就會發現很好的失敗,導致我們完全面臨這個問題 – Wilbert

+1

我試圖找出是否可以使用ILGen /代碼生成爲你自動創建包裝類,但是我懷疑它會很好地與VS Test Runner一起玩。 –