Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单元测试方法是否正在数据库中创建记录_C#_Unit Testing_Nsubstitute - Fatal编程技术网

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
    。这是一个很好的迹象,表明您应该结合数据库对其进行测试。不要让自己陷入单元测试比集成测试更好的想法中。不管博客作者怎么说,从全球意义上讲,没有一项测试天生比另一项更好。