我确实意识到这个问题很老了,我的解决方案既不针对 VS2012,也不针对 NUnit 早期版本的限制。但是,我发现您的问题与现代环境中的其他问题完全相同。我也偶然发现了这一点,并找到了一个合适的解决方案,我认为可能适合其他人或我未来的自己,来满足您的要求:
我现在想要的是创建一个测试项目,它应该确保必须采用接口中定义的所有方法......
是否有任何框架/模式可用于自动强制创建测试方法。
通过TestCaseSource
与适配器模式结合使用,我能够强制接口的任何后续更改都将使程序员也必须更新测试。反对使用反射的好处在于,这会给您带来早期的编译时错误,并且通过运行特定的测试更容易追踪测试错误。
下面的代码非常示意性。我自己的用途是将它与特定数据的模拟结合起来,testObject
并验证是否总是抛出一些特定的异常。限制是testObject
共享的设置,因此最适合更简单的场景。
测试代码:
[TestFixture()]
public class SpecificDatabaseTest : IDatabase
{
private SpecificDatabase testObject = new SpecificDatabase();
private object TestObject = new object();
private SomeObject TestSomeObject1 = new SomeObject();
private SomeObject TestSomeObject2 = new SomeObject();
public IEnumerable<TestCaseData> SomeMethodData
{
get
{
yield return new TestCaseData(TestObject).Returns(TestObject);
}
}
public IEnumerable<TestCaseData> SomeOtherMethodData
{
get
{
yield return new TestCaseData(TestSomeObject1, TestSomeObject2).Returns(TestSomeObject2);
yield return new TestCaseData(TestSomeObject2, TestSomeObject1).Returns(TestSomeObject1);
}
}
[Test, TestCaseSource(nameof(SomeMethodData))]
public object SomeMethod(object data)
{
return testObject.SomeMethod(data);
}
[Test, TestCaseSource(nameof(SomeOtherMethodData))]
public SomeObject SomeOtherMethod(SomeObject data1, SomeObject data2)
{
return testObject.SomeOtherMethod(data1, data2);
}
}
其他代码:
public interface IDatabase
{
object SomeMethod(object data);
SomeObject SomeOtherMethod(SomeObject data1, SomeObject data2);
}
public class SpecificDatabase : IDatabase
{
public object SomeMethod(object data)
{
return data;
}
public SomeObject SomeOtherMethod(SomeObject data1, SomeObject data2)
{
return data2;
}
}
public class SomeObject { }