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
是数据库中的项列表,但是您已经删除了所有项,因此它将是一个空集合。无论如何,我认为清理存储库只是为了测试您的添加逻辑是否在良好的“单元测试”中工作。您仍然依赖于数据库并删除不应删除的数据。