Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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#_Asp.net_Visual Studio_Unit Testing_Testing - Fatal编程技术网

C# 测试函数

C# 测试函数,c#,asp.net,visual-studio,unit-testing,testing,C#,Asp.net,Visual Studio,Unit Testing,Testing,我需要为函数编写一个单元测试。我对测试一无所知,我看到的例子更倾向于数学,所以我不知道如何为这个功能编写测试。有人能帮我写一个这个函数的单元测试吗 public static void CreateUser( int userId, string name, System.DateTime createdAt, string createdBy, System.DateTime modifiedAt, string modifiedBy,

我需要为函数编写一个单元测试。我对测试一无所知,我看到的例子更倾向于数学,所以我不知道如何为这个功能编写测试。有人能帮我写一个这个函数的单元测试吗

public static void CreateUser(
    int userId, 
    string name, 
    System.DateTime createdAt, 
    string createdBy, 
    System.DateTime modifiedAt, 
    string modifiedBy, 
    string address, 
    string city, 
    string province, 
    string country, 
    string postcode, 
    string phone)
{
    try
    {
        using (UserDbContext _usermain = new UserDbContext())
        {
            User newuser = new User()
            {
                UserId = userId,
                Name = name,
                CreatedAt = createdAt,
                CreatedBy = createdBy,
                ModifiedBy = modifiedBy,
                ModifiedAt = modifiedAt,
                Address = address,
                City = city
            };
            _usermain.Users.Add(newuser);
            _usermain.SaveChanges();
        }
    }
    catch (Exception ex)
    {
        string error = string.Format("Error in Creating User", ex.Message);
        throw new Exception(error, ex);
    }
}

应该编写单元测试来验证函数的行为。在您的情况下,您的功能是接收输入并更新数据库。编写单元测试将很困难,因为很难模拟数据库。实际上,您需要找到一种方法来模拟
UserDbContext
,将输入传递给函数,并验证数据库是否正确更新

我认为单元测试不适合此函数。它的唯一目的是改变一个你无法轻易模仿的外部环境。使测试更容易的一些更改包括:

  • 注入上下文,而不是创建新的上下文(这样就可以传入模拟)。这可能比它的价值更麻烦
  • 使其具有两个功能—一个用于创建
    用户
    ,另一个用于获取
    用户
    ,并将其插入数据库。(在这种情况下,我会对第一种方法进行单元测试,但不会对第二种方法进行单元测试)。如果您已经为
    用户
    构造函数进行了单元测试,则不需要进行分离和单元测试
作为补充说明,捕获任何异常并抛出新的泛型异常不会增加价值。事实上,由于丢失或隐藏以下信息,它会删除值:

  • 原始堆栈跟踪
  • 错误消息
  • 异常的类型

当您抛出一个新异常时,所有这些都隐藏在
InnerException
中。只要取出try/catch块,让原始异常冒泡出来,如果你不打算对它做任何事情。

这个方法,它当前的编写方式,是不可单元测试的。单元测试不应依赖于任何外部资源(包括数据库),因为它们需要在不更改任何背景数据的情况下可重复。在您的情况下,因为您正在方法本身中创建数据库上下文,所以您无法控制如何为单元测试创建它。您必须以某种方式修改该方法,以便在测试时可以传入一个模拟(读:false)实例;您需要模拟数据库上下文。关于这个依赖关系,有几篇很好的博客文章?依赖于
UserDbContext
。所以我删除了try/catch,然后编写了一个test[TestMethod]public void CreateUser_test(){UserRepository.DeleteAllUser();List user=UserRepository.GetAllUsers();//Assert.IsNotNull(reportuser);Assert.AreEqual(0,user.Count);var item=UserRepository.getalluser();foreach(item中的var i){UserRepository.CreateUser(i.UserId,“Ali”,DateTime.Now,“Saniya”,DateTime.Now,“Saniya”,“Pak”,“Rwp”,“Punjab”,“Pakistan”,“46000”,“03361054”);var allUser=UserRepository.getalluser();Assert.AreEqual(allUser.Count(),item.Count());}但现在我遇到了一个异常,测试失败System.Data.Core.MetaDataExceptions:无法加载指定的元数据资源@DStanley@Saniya您有适合您的单元测试项目的配置吗?具体来说,数据模型的连接字符串?No-
item
是数据库中的项列表,但是您已经删除了所有项,因此它将是一个空集合。无论如何,我认为清理存储库只是为了测试您的添加逻辑是否在良好的“单元测试”中工作。您仍然依赖于数据库并删除不应删除的数据。