在Effort数据库上为单元测试创​​建存储过程


我有一个函数使用Entity Framework调用存储过程:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

我想使用Effort为它创建一个单元测试。我已经有Effort(和NMemory数据库)模拟数据库(基于我的上下文),在每个单元测试的Initialize ,如:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

EffortProviderFactory在哪里:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

我测试了添加存储过程创建,如下所示:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

但它会抛出NotSupportedException 。我该怎么办,最好的方法是什么?

一般承认的答案

Effort是一个基于文件的内存数据库提供程序,它为DbContext实例提供私有的临时数据库:新上下文,新数据库,无测试交互。那是好事。

当然,缺点是它不是 - 而且永远不会 - 是一个成熟的数据库引擎。因此,它永远不会支持用任何常见SQL方言(如t-SQL或PL-SQL)编写的存储过程。就Effort(即NMemory)存储过程而言,它只是一个存储的IQueryable ,从StoredProcedure构造函数中可以看出。注意与t-SQL存储过程远程相关。

在数据访问层代码中测试存储过程的唯一方法是编写集成测试,这是一个非常好的想法。大致有两种方法可以使集成测试彼此独立:

  • 为每个测试创建/播种新数据库

  • 使用包含测试用例的现有数据库并在每次测试后回滚更改, 例如使用TransactionScope

集成测试永远不会像单元测试一样快,它们只能补充单元测试,但是,在我自己的与数据层相关的编码实践中,它们已经成为测试套件中的一等公民。对我来说,正确性比速度更重要。





许可下: CC-BY-SA
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因