刚开始学习和编写一天前的单元测试,所以这可能是一个非常简单的问题:
我在我的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);
}
答案 0 :(得分:3)
我认为我们不应该点击并插入真正的数据库吗?
是的,你应该。它不是一个单元测试&#34;,但它是一个有价值的测试。随着您在编程方面做得越来越好,您会发现大多数错误都位于程序的边缘,它触及其他类似数据库的东西。
我喜欢写CRUD测试。一种测试方法&#34;实际上执行一系列测试。通常采用这种模式:
即使所有内容都采用一种大方法,但将每个步骤视为自己的测试,恰好使用之前的测试作为设置。
答案 1 :(得分:1)
正如Jonathan解释的那样,你确实想要测试插入,以及其他操作。 在我看来,CRUD测试对于处理数据库记录的Model非常健康。 但这更像是集成测试,而不是单元测试。
要使其成为“纯粹”单元测试,您需要仅测试 特定功能。那么如何在没有实际插入数据库的情况下测试数据库插入的方法(或拥有数据库)?模拟对象! :) 以下是与您讨论的类似问题: How to unit test an object with database queries
此外,简单的谷歌搜索将帮助您更好地理解它。 但在细菌方面,你是嘲笑数据库,或者你需要的任何其他对象。 为此你可能需要一些外部库,但这不应该是一个问题,因为现在嘲笑是一件很常见的事情。 一些有用的链接:
祝你好运!