C# 单元测试方法是否正在数据库中创建记录
一天前刚开始学习和编写单元测试,所以这个问题可能太简单了: 我在我的C# 单元测试方法是否正在数据库中创建记录,c#,unit-testing,nsubstitute,C#,Unit Testing,Nsubstitute,一天前刚开始学习和编写单元测试,所以这个问题可能太简单了: 我在我的DBTaskHanlder类中有这个方法,我想为它做一些单元,我可以在ModelState无效时编写一个,但现在可以编写下一个: public bool CreateTask(ForgotPasswordViewModel fpModel) { if (!ModelState.IsValid) { return false; } try { Create
DBTaskHanlder
类中有这个方法,我想为它做一些单元,我可以在ModelState无效时编写一个,但现在可以编写下一个:
public bool CreateTask(ForgotPasswordViewModel fpModel)
{
if (!ModelState.IsValid)
{
return false;
}
try
{
CreateTaskFromModel(fpModel);
_dbContext.SaveChanges();
return true;
}
catch (Exception e)
{
var issue = e.ToString();
throw;
}
}
CreateTaskFromModel
是一种private
方法,其工作就是在表的数据库中创建新行。
所以我想测试这个方法何时被调用,是否在DB中创建了一个新行?
这真的是正确的测试吗?如何测试?我不认为我们应该点击并插入真实的数据库,对吗
private void CreateTaskFromModel(ForgotPasswordViewModel fpModel)
{
var message = _dbContext.Create<Message>();
message.MessageType = "TASK".PadLeft(10);
message.Assigned_User_K = fpModel.SendPasswordRequestTo.Trim();
message.Assigned_Date = DateTime.Today;
message.Source_User_K = string.Empty;
message.Target_File_K = "WEBCFGPHRM";
message.Owner_User_K = string.Empty;
message.Message_K = _keyGenerator.Get10ByteBase36Key();
_dbContext.Messages.Add(message);
}
private void CreateTaskFromModel(ForgotPasswordViewModel fpModel)
{
var message=_dbContext.Create();
message.MessageType=“TASK”.PadLeft(10);
message.Assigned_User_K=fpModel.SendPasswordRequestTo.Trim();
message.Assigned_Date=DateTime.Today;
message.Source\u User\u K=string.Empty;
message.Target_File_K=“webcfgprm”;
message.Owner\u User\u K=string.Empty;
message.message_K=_keyGenerator.Get10ByteBase36Key();
_dbContext.Messages.Add(消息);
}
我不认为我们应该点击并插入真实的数据库,对吗
private void CreateTaskFromModel(ForgotPasswordViewModel fpModel)
{
var message = _dbContext.Create<Message>();
message.MessageType = "TASK".PadLeft(10);
message.Assigned_User_K = fpModel.SendPasswordRequestTo.Trim();
message.Assigned_Date = DateTime.Today;
message.Source_User_K = string.Empty;
message.Target_File_K = "WEBCFGPHRM";
message.Owner_User_K = string.Empty;
message.Message_K = _keyGenerator.Get10ByteBase36Key();
_dbContext.Messages.Add(message);
}
是的,你应该。这不是一个“单元测试”,但它是一个有价值的测试。随着编程能力的提高,您会发现大多数bug都位于程序的边缘,与数据库等其他东西有接触
我喜欢写CRUD测试。一种实际执行一系列测试的“测试方法”。通常在这种模式下:
即使所有内容都在一个大的方法中,也要将每个步骤视为它自己的测试,碰巧将前一个测试用作设置 正如Jonathan所解释的,您确实需要测试insert和其他操作。 在我看来,CRUD测试对于处理数据库记录的模型来说是一个非常健康的检查。 但这更像是集成测试,而不是单元测试 为了使它成为“纯”单元测试,您只需要测试特定功能。那个么,在并没有向数据库中实际插入任何内容(或者有一个数据库)的情况下,如何测试db插入的方法呢?模拟对象!:) 这里有一个与你的问题类似的问题: 此外,一个简单的谷歌搜索将帮助您更好地理解它。 但实际上,您是在模拟数据库或您需要的任何其他对象。 为此,您可能需要一些外部库,但这不应该是一个问题,因为模仿是当今非常常见的事情。 一些有用的链接:
祝你好运 测试是正确的,但此时不应称之为“单元测试”——“集成测试”是更好的名称。看,是的,我不想在上面做集成测试,过去有人编写了实际的插入代码,所以我只是在做一个纯单元测试。即使模拟数据访问层,如何避免也要进行后续读取操作,以验证记录是否确实添加到模拟数据存储中?添加记录的单元测试现在取决于读回记录的实现。您将如何解决它?回应我自己的评论:也许我们只是验证来自存储库的正确接口方法被调用了适当的次数。但是它并没有真正检查代码是否有其他错误逻辑。是的,我不想对其进行集成测试,过去有人编写了实际的插入代码,所以我只是在做一个纯单元测试,这个类叫做
DBTaskHandler
。这是一个很好的迹象,表明您应该结合数据库对其进行测试。不要让自己陷入单元测试比集成测试更好的想法中。不管博客作者怎么说,从全球意义上讲,没有一项测试天生比另一项更好。