Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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# 如果数据库中已经存在特定条目,如何测试[TDD]_C#_Database_Unit Testing_Mocking_Tdd - Fatal编程技术网

C# 如果数据库中已经存在特定条目,如何测试[TDD]

C# 如果数据库中已经存在特定条目,如何测试[TDD],c#,database,unit-testing,mocking,tdd,C#,Database,Unit Testing,Mocking,Tdd,我是C#的新手,正在学习TDD。我看到了mock对象的使用,但是我在搜索类似我正在做的事情时被困了好几天,我什么也没找到 我对单元测试的第一条规则是,不应该存在两个具有相同属性的特定对象 我给你举个例子:假设对象是学生,我不能有两个领导者,所以,在我的新手头脑中,我的测试类似于创建两个学生并将他们设置为领导者。当我坚持第二步时,我会接受一个例外,或者类似的情况 好的,TDD是关于还没有数据项目,而Mock只是为了模拟单个实体(如果我正确理解了这个概念的话)。。。所以如何模拟数据库,以便在持久化之

我是C#的新手,正在学习TDD。我看到了mock对象的使用,但是我在搜索类似我正在做的事情时被困了好几天,我什么也没找到

我对单元测试的第一条规则是,不应该存在两个具有相同属性的特定对象

我给你举个例子:假设对象是学生,我不能有两个领导者,所以,在我的新手头脑中,我的测试类似于创建两个学生并将他们设置为领导者。当我坚持第二步时,我会接受一个例外,或者类似的情况

好的,TDD是关于还没有数据项目,而Mock只是为了模拟单个实体(如果我正确理解了这个概念的话)。。。所以如何模拟数据库,以便在持久化之前检查是否有领导者,甚至创建学生或将学生设置为领导者。还是有更好的方法


非常感谢

您需要模拟一切,包括数据库层。如果通过
IRepository
实例访问数据库,则应创建如下内容:

 public interface IRepository
 {
     List<Student> GetAllStudents();
     void AddStudent(Student student);
     Teacher GetStudentTeacher(int studentId);
 }

 public class MockRepository : IRepository
 {
     public static List<Student> Students { get; set; }
     public static List<Teachers> Teachers { get; set; }

     static MockRepository()
     {
         Students = new List<Student>();
     }

     public List<Student> GetAllStudents()
     {
         return Students.ToList();
     }

     public void AddStudent(Student student)
     {
         Students.Add(student);
     }

     public Teacher GetStudentTeacher(int studentId)
     {
         var student = Students.FirstOrDefault(s => s.Id == studentId);
         if (student != null)
         {
             return Teachers.FirstOrDefault(t => t.Id == student.TeacherId);
         }

         return null;
     }
 }
公共接口IRepository
{
列出GetAllStudents();
无效的学生(学生);
教师获取学生教师(int studentId);
}
公共类存储库:IRepository
{
公共静态列表学生{get;set;}
公共静态列表{get;set;}
静态MockRepository()
{
学生=新列表();
}
公共列表GetAllStudents()
{
返回学生;
}
公立学校学生(学生)
{
学生。添加(学生);
}
公共教师GetStudentTeacher(int studentId)
{
var student=Students.FirstOrDefault(s=>s.Id==studentId);
如果(学生!=null)
{
返回Teachers.FirstOrDefault(t=>t.Id==student.TeacherId);
}
返回null;
}
}

上层可以负责在学生已经有老师并且试图添加第二个老师的情况下抛出异常。

您需要模拟一切,包括数据库层。如果通过
IRepository
实例访问数据库,则应创建如下内容:

 public interface IRepository
 {
     List<Student> GetAllStudents();
     void AddStudent(Student student);
     Teacher GetStudentTeacher(int studentId);
 }

 public class MockRepository : IRepository
 {
     public static List<Student> Students { get; set; }
     public static List<Teachers> Teachers { get; set; }

     static MockRepository()
     {
         Students = new List<Student>();
     }

     public List<Student> GetAllStudents()
     {
         return Students.ToList();
     }

     public void AddStudent(Student student)
     {
         Students.Add(student);
     }

     public Teacher GetStudentTeacher(int studentId)
     {
         var student = Students.FirstOrDefault(s => s.Id == studentId);
         if (student != null)
         {
             return Teachers.FirstOrDefault(t => t.Id == student.TeacherId);
         }

         return null;
     }
 }
公共接口IRepository
{
列出GetAllStudents();
无效的学生(学生);
教师获取学生教师(int studentId);
}
公共类存储库:IRepository
{
公共静态列表学生{get;set;}
公共静态列表{get;set;}
静态MockRepository()
{
学生=新列表();
}
公共列表GetAllStudents()
{
返回学生;
}
公立学校学生(学生)
{
学生。添加(学生);
}
公共教师GetStudentTeacher(int studentId)
{
var student=Students.FirstOrDefault(s=>s.Id==studentId);
如果(学生!=null)
{
返回Teachers.FirstOrDefault(t=>t.Id==student.TeacherId);
}
返回null;
}
}

上层可以负责抛出异常,以防学生已经有老师,并且有人试图添加第二个。就我个人而言,我不会测试数据库实现。我将设置数据库,以确保列设置为唯一的,并让数据库完成其工作

也就是说,如果您想测试您是否在数据库抽象中捕捉到了您的独特性。您将使用多个项设置一个接口实现,其中两个项是非唯一的,并确保捕获它

e、 g

公共接口IPersonRepository
{
无效添加人(人);
IEnumerable GetPeople();
}
公共类人员服务
{
私有静态只读IPersonRepository_repo;
公共人员服务(IPersonRepository repo)
{
_回购=回购;
}
公众人士(人)
{
var people=_repo.GetPeople();
if(people.Select(p=>p.LastName).Contains(person.LastName))
{
//人存在
}
_回购人(人);
}
}
公共类人员服务测试
{
公共空间不应包含个人存在()
{
var mockRepo=new Mock();
mockRepo.Set(r=>r.GetPeople()).Returns(new[]{newperson(firstName,lastName),newperson(otherName,lastName));
var服务=新的PersonService(mockRepo.Object);
///尝试添加并检查抛出的断言或异常
}
}

就个人而言,我不会测试数据库实现。我会设置数据库以确保列设置为唯一,并让数据库完成其工作

也就是说,如果您想测试您是否在数据库抽象中捕捉到了您的唯一性,那么您应该使用多个项设置一个接口实现,其中两个项是非唯一的,并确保捕捉到它

e、 g

公共接口IPersonRepository
{
无效添加人(人);
IEnumerable GetPeople();
}
公共类人员服务
{
私有静态只读IPersonRepository_repo;
公共人员服务(IPersonRepository repo)
{
_回购=回购;
}
公众人士(人)
{
var people=_repo.GetPeople();
if(people.Select(p=>p.LastName).Contains(person.LastName))
{
//人存在
}
_回购人(人);
}
}
公共类人员服务测试
{
公共空间不应包含个人存在()
{
var mockRepo=new Mock();
mockRepo.Set(r=>r.GetPeople()).Returns(new[]{newperson(firstName,lastName),newperson(otherName,lastName));
var服务=新的PersonService(mockRepo.Object);
///尝试添加并检查抛出的断言或异常
}
}

我正在考虑将这个模拟存储库添加到lis中