如果使用存储过程,则对Entity Framework Core 2.0进行单元测试

时间:2018-02-25 11:36:33

标签: c# unit-testing entity-framework-core

单元测试数据访问层时遇到问题。我通过存储过程查询数据库,所以现在我不能使用Entity Framework内存数据库,因为内存数据库不是关系数据库。另外,我读到我必须使用集成测试,但我找不到任何使用存储过程进行测试的示例。

所以我的问题是如何测试数据访问层,我是否需要创建一个与我的真实数据库相同的测试数据库?

这是我的数据访问层代码:

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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

我的建议是使用测试(真实)数据库(根据您公司的政策,它可以测试服务器上的数据库,或者您可以使用您的开发计算机上的数据库提供程序的本地实例等。)

集成测试的目的是验证您的应用程序是否作为单个单元运行稳定。测试环境必须尽可能接近生产evn。这意味着真实数据库。内存数据库表示中的EF对此没有好处。

您还可以查看 component tests 。它们就像集成测试一样,但是使用它们你不会将应用程序作为一个单元进行测试,而是应用程序的主要组件,如存储库,服务......等,另一方面进行集成测试,你最喜欢测试REST api端点(在REST应用程序的上下文中)。

关于集成/组件测试的一些注意事项

  • 在最好的情况下,您需要更改测试环境(您的集成测试项目)。将是在web / app.cofing中使用本地/测试数据库配置的连接字符串。
  • 使用集成测试时没有模拟
  • 在每次测试之前重置数据库的状态。这样可以避免数据库的大小增加。

集成测试示例

如果您正在开发REST api(仅举例)。这是非常基本的测试用例,不能作为100%最佳实践。只是想看看它们可能是什么。

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

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