2014-10-31 75 views
3

我有一個抽象類與抽象方法,它的子類覆蓋此方法必須維護某個合同。 (我做不是意味着.NET的代碼契約,只是代碼契約本身的概念)。該合同的測試代碼可以相同。我如何在保持DRY(不要重複自己)原則的同時在NUnit上測試所有子類的合同?如何使用NUnit測試合同?

(我因爲理由超出了我的控制範圍而與NUnit卡在一起,並且與此問題無關)。

+0

除了給定派生類的具體實現外,您還想測試什麼? – 2014-10-31 11:15:30

+0

我想測試所有派生類必須實現的合約。如果我爲每個派生類編寫測試,它將是相同的確切代碼,除了類名稱。 – 2014-10-31 11:22:45

回答

3

您可以使用抽象方法創建基本測試類以獲取要測試的實現,然後爲每個派生類創建派生實例以進行測試。

像這樣的事情

[TestClass] 
public abstract class TestBase 
{ 
    protected abstract IMyInterface GetObjectToTest(); 

    [Test] 
    public void TestMethod() 
    { 
      IMyInterface objectToTest = GetObjectToTest(); 
      //Do your generic test of all implementations of IMyInterface 
      objectToTest.Setup(); 
      //... 
      Assert.Equal(objectToTest.Property,100); 
      //etc 
    } 
} 

[TestClass] 
public class ConcreteTestClass : TestBase 
{ 
    protected override GetObjectToTest() 
    { 
     return new ConcreteImplementationOfIMyObject(); 
    } 

    [Test] 
    public void TestConcreteImplementationOfIMyObjectSpecificMethod() 
    { 
     //test method for stuff which only applies to ConcreteImplementationOfIMyObject types 
    } 
} 

使用這種方法,你把你所有的測試,適用於在基類接口的所有實例,然後把它特定於一個特定的實施方案的任何測試測試班。