我們有一個共享的基本接口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() {}
}
與小代碼示例將有很大的幫助 – Backs
嗯,這麼大的重構通常的觀點是大幅降低了測試工作。因爲測試任何正常客戶端代碼無法使用的東西都沒有意義。 –