我有一个抽象类的抽象类,它覆盖这个方法的子类必须支持某个契约。 (我不意味着.NET代码合同,只是代码合同本身的概念)。该合同的测试代码可以是相同的。如何在保持DRY(不要重复自己)原则的同时在所有子类上使用NUnit测试此合同?
(由于我无法控制的原因而且与此问题无关,我被NUnit困住了。)
答案 0 :(得分: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
}
}
使用此方法,您可以将所有适用于接口的所有实例的测试放在基类中,然后在该测试类中放置特定于特定实现的任何测试。