单元测试方法是否在数据库

时间:2016-06-16 16:29:03

标签: 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;
    }
}

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);
    }

2 个答案:

答案 0 :(得分:3)

  

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

是的,你应该。它不是一个单元测试&#34;,但它是一个有价值的测试。随着您在编程方面做得越来越好,您会发现大多数错误都位于程序的边缘,它触及其他类似数据库的东西。

我喜欢写CRUD测试。一种测试方法&#34;实际上执行一系列测试。通常采用这种模式:

  1. 创建
  2. 通过主键阅读。是否正确设置了所有字段?
  3. 通过集合阅读。您将获得大量记录,是集合中新创建的记录吗?
  4. 更新
  5. 通过主键阅读。字段是否正确更改?
  6. 删除
  7. 通过主键阅读。什么都没有归还,对吗?
  8. 通过集合阅读。您将获得大量记录,新创建的记录是否已不再存在于集合中?剩下的记录还在吗?
  9. 即使所有内容都采用一种大方法,但将每个步骤视为自己的测试,恰好使用之前的测试作为设置。

答案 1 :(得分:1)

正如Jonathan解释的那样,你确实想要测试插入,以及其他操作。 在我看来,CRUD测试对于处理数据库记录的Model非常健康。 但这更像是集成测试,而不是单元测试。

要使其成为“纯粹”单元测试,您需要测试 特定功能。那么如何在没有实际插入数据库的情况下测试数据库插入的方法(或拥有数据库)?模拟对象! :) 以下是与您讨论的类似问题: How to unit test an object with database queries

此外,简单的谷歌搜索将帮助您更好地理解它。 但在细菌方面,你是嘲笑数据库,或者你需要的任何其他对象。 为此你可能需要一些外部库,但这不应该是一个问题,因为现在嘲笑是一件很常见的事情。 一些有用的链接:

https://msdn.microsoft.com/en-ca/library/ff650441.aspx

https://en.wikipedia.org/wiki/Mock_object

祝你好运!