【发布时间】:2021-11-28 16:39:35
【问题描述】:
我目前正在尝试为将数据插入数据库的方法创建单元测试。我知道我需要模拟或创建一个假类,以便我的测试数据不会添加到我的数据库中,但我不知道如何去做。有人有想法吗?
这是我的控制台“用户界面”涉及的代码。这是在我的“商业”C# 项目中:
/// <summary>
/// Gets the connection string.
/// </summary>
private static readonly string _connectionString = ConfigurationManager.ConnectionStrings["Database"].ConnectionString;
/// <summary>
/// Inserts a new admin into the Admins database table.
/// </summary>
/// <param name="admin">Admin record.</param>
public static void InsertNewAdmin(Admin admin)
{
var adminDatabaseWriter = new AdminDatabaseWriter(_connectionString);
adminDatabaseWriter.Insert(admin);
}
从那里它进入我的 AdminDatabaseWriter 类并在方法“Insert”中执行以下操作:
/// <summary>
/// Inserts a new admin into the Admins database table.
/// </summary>
/// <param name="admin">Admin record.</param>
public void Insert(Admin admin)
{
using SqlConnection sqlConnection = new(_connectionString);
sqlConnection.Open();
using SqlCommand sqlCommand = DatabaseHelper.CreateNewSqlCommandWithStoredProcedure("InsertNewAdmin", sqlConnection);
sqlCommand.Parameters.AddWithValue("@PIN", admin.PIN);
sqlCommand.Parameters.AddWithValue("@AdminType", admin.AdminTypeCode);
sqlCommand.Parameters.AddWithValue("@FirstName", admin.FirstName);
sqlCommand.Parameters.AddWithValue("@LastName", admin.LastName);
sqlCommand.Parameters.AddWithValue("@EmailAddress", admin.EmailAddress);
sqlCommand.Parameters.AddWithValue("@Password", admin.Password);
sqlCommand.Parameters.AddWithValue("@AssessmentScore", admin.AssessmentScore);
var userAddedSuccessfully = sqlCommand.ExecuteNonQuery();
sqlConnection.Close();
if (userAddedSuccessfully < 0)
{
throw new AdminNotAddedToDatabaseException("User was unsuccessful at being uploaded to the database for an unknown reason.");
}
}
再次,我正在尝试对我附加的最后一段代码进行单元测试。测试我的代码是否将对象实际添加到数据库中而不实际将其添加到数据库中的最佳方法是什么。
【问题讨论】:
-
不要使用 SqlConnection,SqlCommand 直接尝试针对它们的通用接口(如 IDbConnection 、IDBCommand 等)进行编程,并为您的测试提供 Mocks。
-
你使用什么测试框架?单元? XUnit? MSTest?
-
除了你当前的问题,还要考虑not use AddWithValue和SqlConnection对象应该是enclosed in using statement
-
@Steve 他正在使用 using。
-
@Ralf 我刚刚学习如何做到这一点并且不熟悉这些界面。你有一个潜在的例子吗?
标签: c# sql .net unit-testing mocking