强制测试方法在数据库接口中定义的所有方法的实现

本文关键字:定义 有方法 实现 接口 测试方法 数据库 | 更新日期: 2023-09-27 18:10:28

我正在设计一个能够将数据源从SQL更改为Oracle和SQLite的解决方案。

为此,我使用Unity框架来实现延迟绑定。

我已经创建了一个接口,并将所有的数据库方法签名写入其中。

现在我正在为每个数据源编写单独的类(项目)并实现这个接口。

我现在想要的是创建一个测试项目,应该确保在接口中定义的所有方法都必须在测试项目中使用,这个测试项目有单独的测试数据库

是否有任何框架/模式可用来自动强制创建测试方法?

如果有人在方法上提供写[TestMethod]属性(当实现接口时)并将返回类型更改为Void,我认为这就足够了。

我真正想要的是实现一个测试项目,它应该强制为数据库层接口中定义的所有签名创建测试方法。

我使用VS 2012作为开发环境。

如果我没有任何现成的解决方案,我如何使用反射来实现方法来测试项目,并在设计时更改其签名。(这个要求奇怪吗?)

如果需要更详细的信息,请告诉我。

欢迎提出建议

强制测试方法在数据库接口中定义的所有方法的实现

我不知道这里有什么特定的模式,但是我在这个场景中是这样做的:

  1. 将接口所在的项目引用到测试项目
  2. 在CRUDProviderMock.cs中实现接口或类似的东西
  3. 使用模拟类进行测试

我相信我不是唯一一个这样做的人,因为我看到很多公司都在这样做。

示例项目如下:https://databaselayertesting.codeplex.com/

示例项目使用Repository Pattern和NUnit框架进行测试,地点:

    IRepository是数据库的CRUD接口
  1. EntityOne是样本数据库实体
  2. 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 { }