gpt4 book ai didi

c# - 在 Effort 数据库上创建存储过程以进行单元测试

转载 作者:行者123 更新时间:2023-11-30 20:28:38 26 4
gpt4 key购买 nike

我有一个使用 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 为其创建一个单元测试。我已经有努力(和 NMemory 数据库)来模拟数据库(基于我的上下文),在每个单元测试的 Initialize 上,例如:

[TestInitialize]
public void Initialize()
{
Effort.Provider.EffortProviderConfiguration.RegisterProvider();
EffortProviderFactory.ResetDb()
using (var context = new MyContext("PWET"))
{
context.Database.CreateIfNotExists();
context.Constructeurs.Add(new Constructeur { Nom = "Zebra" });
context.Constructeurs.Add(new Constructeur { Nom = "Joya" });
context.SaveChanges();
}
}

其中EffortProviderFactory是:

public class EffortProviderFactory : IDbConnectionFactory
{
private static DbConnection _connection;
private readonly static object _lock = new object();

public static void ResetDb(){
lock (_lock){
_connection = null;
}
}
public DbConnection CreateConnection(string nameOrConnectionString)
{
lock (_lock){
if (_connection == null)
_connection = Effort.DbConnectionFactory.CreateTransient();
return _connection;
}
}
}

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

[TestInitialize]
public void Initialize()
{
Effort.Provider.EffortProviderConfiguration.RegisterProvider();
EffortProviderFactory.ResetDb()
using (var context = new MyContext("PWET"))
{
context.Database.CreateIfNotExists();
context.Database.ExecuteSqlCommand(@"
CREATE PROCEDURE [dbo].[myStoredProcedure]
@id INT = 0
AS
BEGIN

SELECT foo
FROM bar
WHERE foo.Id = @id

ORDER BY foo.Id;
END");
}
}

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

最佳答案

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

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

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

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

关于c# - 在 Effort 数据库上创建存储过程以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47033466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com