C# 单元测试实体框架核心2.0(如果使用存储过程)
我对单元测试数据访问层有问题。我通过存储过程查询数据库,所以现在我不能在内存数据库中使用实体框架,因为内存数据库不是关系数据库。另外,我读到我必须使用集成测试,但我找不到任何使用存储过程进行测试的例子 所以我的问题是如何测试数据访问层,我是否需要创建一个与真实数据库相同的测试数据库 这是我的数据访问层代码:C# 单元测试实体框架核心2.0(如果使用存储过程),c#,unit-testing,entity-framework-core,C#,Unit Testing,Entity Framework Core,我对单元测试数据访问层有问题。我通过存储过程查询数据库,所以现在我不能在内存数据库中使用实体框架,因为内存数据库不是关系数据库。另外,我读到我必须使用集成测试,但我找不到任何使用存储过程进行测试的例子 所以我的问题是如何测试数据访问层,我是否需要创建一个与真实数据库相同的测试数据库 这是我的数据访问层代码: public class Repository<TEntity> : IRepository<TEntity> where TEntity : Domains.Use
public class Repository<TEntity> : IRepository<TEntity> where TEntity : Domains.Users
{
private DbSet<TEntity> dbSet;
private readonly DbContext context;
public Repository(DbContext context)
{
this.context = context;
dbSet = context.Set<TEntity>();
}
public void Add(TEntity entity)
{
if (entity is Domains.Users)
{
SqlParameter param1 = new SqlParameter();
param1.ParameterName = "@Adress";
param1.DbType = System.Data.DbType.String;
param1.Value = (entity as Domains.Users).Adress;
SqlParameter param2 = new SqlParameter();
param2.ParameterName = "@Email";
param2.DbType = System.Data.DbType.String;
param2.Value = (entity as Domains.Users).Email;
SqlParameter param3 = new SqlParameter();
param3.ParameterName = "@Name";
param3.DbType = System.Data.DbType.String;
param3.Value = (entity as Domains.Users).Name;
SqlParameter param4 = new SqlParameter();
param4.ParameterName = "@Lastname";
param4.DbType = System.Data.DbType.String;
param4.Value = (entity as Domains.Users).Lastname;
context.Database.ExecuteSqlCommand("sp_AddUser @Adress, @Email, @Name, @Surname", param1, param2, param3, param4);
}
}
}
公共类存储库:IRepository其中tenty:Domains.Users
{
私有数据库集;
私有只读DbContext上下文;
公共存储库(DbContext上下文)
{
this.context=上下文;
dbSet=context.Set();
}
公共无效添加(TEntity实体)
{
if(实体为Domains.Users)
{
SqlParameter param1=新的SqlParameter();
param1.ParameterName=“@address”;
param1.DbType=System.Data.DbType.String;
param1.Value=(实体为Domains.Users);
SqlParameter param2=新的SqlParameter();
param2.ParameterName=“@Email”;
param2.DbType=System.Data.DbType.String;
param2.Value=(实体为Domains.Users);
SqlParameter param3=新的SqlParameter();
param3.ParameterName=“@Name”;
param3.DbType=System.Data.DbType.String;
param3.Value=(实体为Domains.Users).Name;
SqlParameter param4=新的SqlParameter();
param4.ParameterName=“@Lastname”;
param4.DbType=System.Data.DbType.String;
param4.Value=(实体为Domains.Users);
context.Database.ExecuteSqlCommand(“sp_AddUser@address,@Email,@Name,@Name”,param1,param2,param3,param4);
}
}
}
我的建议是使用test(real)数据库(取决于贵公司的政策,它可以是测试服务器上的数据库,也可以是开发机器上数据库提供商的本地实例..等等)
集成测试的重点是验证应用程序是否作为单个单元稳定工作。测试环境。必须尽可能接近生产evn。这意味着一个真正的数据库。内存中的EF数据库表示法对此没有好处
您还可以检查。它们类似于集成测试,但使用它们,您不会将应用程序作为一个单元进行测试,而是测试应用程序的主要组件,如存储库、服务。。等等,在集成测试的另一方面,您最喜欢测试RESTAPI端点(在REST应用程序的上下文中)
集成/组件测试的一些注意事项
- 在最好的情况下,您只需要为testenv(您的集成测试项目)更改一件事。将是使用web/app.cofing中的本地/测试数据库配置的连接字符串
- 使用集成测试时无模拟
- 在每次测试之前重置数据库的状态。这样可以避免数据库的大小增长
- 测试数据库中有记录/无记录的GET端点
- 测试不同资源的授权策略
- 使用有效/无效数据测试POST端点
- 断言数据库状态,如表计数和请求的http响应代码
- 等等李>
注意:在某些情况下,在开始开发实际数据库之前,我们仅在请求应用程序进行一些原型设计时才使用内存表示。非常感谢您提供的有用信息和帮助!!