强制测试方法在数据库接口中定义的所有方法的实现
本文关键字:定义 有方法 实现 接口 测试方法 数据库 | 更新日期: 2023-09-27 18:10:28
我正在设计一个能够将数据源从SQL更改为Oracle和SQLite的解决方案。
为此,我使用Unity框架来实现延迟绑定。
我已经创建了一个接口,并将所有的数据库方法签名写入其中。
现在我正在为每个数据源编写单独的类(项目)并实现这个接口。
我现在想要的是创建一个测试项目,应该确保在接口中定义的所有方法都必须在测试项目中使用,这个测试项目有单独的测试数据库
是否有任何框架/模式可用来自动强制创建测试方法?
如果有人在方法上提供写[TestMethod]属性(当实现接口时)并将返回类型更改为Void,我认为这就足够了。
我真正想要的是实现一个测试项目,它应该强制为数据库层接口中定义的所有签名创建测试方法。
我使用VS 2012作为开发环境。
如果我没有任何现成的解决方案,我如何使用反射来实现方法来测试项目,并在设计时更改其签名。(这个要求奇怪吗?)
如果需要更详细的信息,请告诉我。
欢迎提出建议
我不知道这里有什么特定的模式,但是我在这个场景中是这样做的:
- 将接口所在的项目引用到测试项目
- 在CRUDProviderMock.cs中实现接口或类似的东西
- 使用模拟类进行测试
我相信我不是唯一一个这样做的人,因为我看到很多公司都在这样做。
示例项目如下:https://databaselayertesting.codeplex.com/
示例项目使用Repository Pattern和NUnit框架进行测试,地点:
- IRepository是数据库的CRUD接口
- EntityOne是样本数据库实体
- EntityOneRepositoryMock是使用列表的模拟IRepository实现
您可以使用示例数据库而不是列表来模拟真实的数据库行为。
我确实意识到这个问题很老了,我的解决方案不针对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 { }