sql查询的单元测试c#

时间:2017-09-27 19:54:27

标签: c# unit-testing

我有一个sql语句,即select x, y, z from T,此查询给出了结果列表。

我的目标是在此查询结果列表时编写单元测试,如果环境发生更改,则无法从数据库中检索。我是新手进行单元测试,并且不知道我是否可以打开和关闭连接。

如果有人可以帮助我,请告诉我。

4 个答案:

答案 0 :(得分:3)

编写单元测试时,不应该尝试测试查询真实数据库。单元测试是关于测试单个单元,这意味着您应该mock来自您正在测试的单元的外部依赖性。

您可能要做的是integration testing

答案 1 :(得分:3)

单元测试数据库调用通常没有多大意义。单元测试应该测试一个隔离的单元而不是您集成的远程数据库。

可以连接到单元测试中的数据库,就像连接到可执行应用程序或数据访问层中的数据库一样。如果您使用Google或Bing,有许多如何执行此操作的示例。例如,您可以使用SqlDataReaderhttps://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx

答案 2 :(得分:2)

这是一个众所周知的问题。您应该使用事务范围。我不知道你是想直接使用sql还是只是使用实体框架,但想法是你在测试开始时创建一个事务范围,将一些测试数据添加到数据库,用select查询调用方法然后提交或完成事务(范围)以确保您的测试数据得到支持。

Example

[TestMethod()] 
public void GetUsersTest() 
{ 
    string connectionString = GetConnectionString();     

    using (TransactionScope ts = new TransactionScope()) 
    { 
        using (SqlConnection connection = 
            new SqlConnection(connectionString)) 
        { 
            connection.Open(); 
            DataLayer dataAccessLayer = new DataLayer();     

            DataSet dataSet = dataAccessLayer.GetUsers(); 
            AddNewUser("Fred", connection);     

            dataSet = dataAccessLayer.GetUsers(); 
            DataRow[] dr = dataSet.Tables[0].Select("[UserName] = 'Fred'"); 
            Assert.AreEqual(1, dr.Length); 
        } 
    } 
}

答案 3 :(得分:0)

如果您正在使用带有C#的EntityFrameworkCore,那么对写入/读取数据库的方法进行单元测试的一种方法是使用InMemory选项。当您想要使用近似连接到真实数据库的内容测试组件时,InMemory提供程序非常有用,而不需要实际数据库操作的开销。此选项不会模拟真实的数据库连接,但提供了一种在单元测试期间持久保存数据的简单方法。下面是一个链接:https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory

顺便说一句,如果您正在尝试测试您的呼叫是否会在新环境中失败,我认为您应该进行集成测试。