我有一个sql语句,即select x, y, z from T
,此查询给出了结果列表。
我的目标是在此查询结果列表时编写单元测试,如果环境发生更改,则无法从数据库中检索。我是新手进行单元测试,并且不知道我是否可以打开和关闭连接。
如果有人可以帮助我,请告诉我。
答案 0 :(得分:3)
编写单元测试时,不应该尝试测试查询真实数据库。单元测试是关于测试单个单元,这意味着您应该mock来自您正在测试的单元的外部依赖性。
您可能要做的是integration testing。
答案 1 :(得分:3)
单元测试数据库调用通常没有多大意义。单元测试应该测试一个隔离的单元而不是您集成的远程数据库。
可以连接到单元测试中的数据库,就像连接到可执行应用程序或数据访问层中的数据库一样。如果您使用Google或Bing,有许多如何执行此操作的示例。例如,您可以使用SqlDataReader
:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader(v=vs.110).aspx。
答案 2 :(得分:2)
这是一个众所周知的问题。您应该使用事务范围。我不知道你是想直接使用sql还是只是使用实体框架,但想法是你在测试开始时创建一个事务范围,将一些测试数据添加到数据库,用select查询调用方法然后不提交或完成事务(范围)以确保您的测试数据得到支持。
[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
顺便说一句,如果您正在尝试测试您的呼叫是否会在新环境中失败,我认为您应该进行集成测试。