单元测试方法是否在数据库中创建记录

3 c# unit-testing nsubstitute

一天前刚开始学习和编写单元测试,所以这可能是一个太简单的问题:

我在我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

CreateTaskFromModel是一种private方法,它的工作是在数据库中的表上创建一个新行。所以我想测试何时调用此方法是在数据库中创建一个新行?它实际上是正确的测试吗?如何测试?我不认为我们应该点击并插入到真正的数据库中,对吗?

   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);
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*len 5

我不认为我们应该点击并插入到真正的数据库中,对吗?

是的你应该。它不是“单元测试”,但它是一个有价值的测试。随着您在编程方面变得越来越好,您会发现您的大多数错误都位于程序的边缘,在那里它会触及其他事物,例如数据库。

我喜欢编写 CRUD 测试。一种实际执行一系列测试的“测试方法”。通常采用这种模式:

  1. 创建
  2. 按主键读取。所有字段都正确设置了吗?
  3. 以合集阅读。你会得到很多记录,新创建的记录在集合中吗?
  4. 更新
  5. 按主键读取。字段是否正确更改?
  6. 删除
  7. 按主键读取。什么都没有返回,对吧?
  8. 以合集阅读。你会得到很多记录,新创建的记录不再在集合中了吗?其余的记录还在吗?

即使一切都在一个大方法中,但将每个步骤视为自己的测试,恰好使用前一个测试作为设置。