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中的本地/测试数据库配置的连接字符串
  • 使用集成测试时无模拟
  • 在每次测试之前重置数据库的状态。这样可以避免数据库的大小增长
集成测试示例

如果您正在开发RESTAPI(仅举一个例子)。这是非常基本的测试用例示例,不能被视为100%的最佳实践。只是想看看他们会是什么样子

  • 测试数据库中有记录/无记录的GET端点
  • 测试不同资源的授权策略
  • 使用有效/无效数据测试POST端点
  • 断言数据库状态,如表计数和请求的http响应代码
  • 等等

注意:在某些情况下,在开始开发实际数据库之前,我们仅在请求应用程序进行一些原型设计时才使用内存表示。

非常感谢您提供的有用信息和帮助!!