一天前刚开始学习和编写单元测试,所以这可能是一个过于简单的问题:
我在我的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);
}发布于 2016-06-16 16:34:39
我不认为我们应该击中并插入真正的数据库,对吗?
是的你应该去。这不是一个“单元测试”,但它是一个有价值的测试。当您在编程方面变得更好时,您会发现大多数bug都在程序的边缘,在那里它涉及到其他方面,比如数据库。
我喜欢写CRUD测试。一个实际执行一系列测试的“测试方法”。通常在这种模式下:
尽管一切都在一个大方法中,但将每一步视为自己的测试,碰巧使用了前面的测试作为设置。
发布于 2016-06-16 16:45:07
正如Jonathan解释的那样,您确实希望测试insert以及其他操作。CRUD测试,在我看来是一个非常健康的检查您的模型,是处理数据库记录。但这更像是集成测试,而不是单元测试。
为了使其成为“纯”单元测试,您需要只测试,即特定功能。那么,如何测试不实际将任何内容插入数据库(或有数据库)的方法呢?)下面是一个与您谈论的问题类似的问题:How to unit test an object with database queries
此外,一个简单的谷歌搜索将帮助您更好地理解它。但更糟糕的是,您正在模拟一个数据库或任何您需要的其他对象。因此,您可能需要一些外部库,但这不应该是一个问题,因为嘲笑是一个相当普遍的事情。一些有用的链接:
https://msdn.microsoft.com/en-ca/library/ff650441.aspx
祝好运!
https://stackoverflow.com/questions/37864693
复制相似问题