gpt4 book ai didi

c# - 如何使用最小起订量模拟 Entity Framework DbRawSqlQuery 对象?

转载 作者:行者123 更新时间:2023-11-30 16:45:12 37 4
gpt4 key购买 nike

var parentid = uow.SqlQuery<int?>("select query", new SqlParameter("Id", Id));

uow 是工作单元的对象。

SqlQuery方法如下:

public DbRawSqlQuery<T> SqlQuery<T>(string query, params object[] parameters)
{
return context.Database.SqlQuery<T>(query, parameters);
}

如何在 C# 中模拟下面的代码?

var parentid = uow.SqlQuery<int?>("select query", new SqlParameter("Id", Id));

最佳答案

示例中的所有类都不能用 moq 模拟,因为它们是具体类并且所讨论的方法不是虚拟的。为了使其更易于测试,将那些类抽象为您控制的抽象。尽量不要模拟您无法控制的接口(interface)和类。

上面的例子仍然与实现问题紧密耦合DbRawSqlQuery<T> .将它与实体分开并让它依赖于抽象 IEnumerable<T> .

public interface IExecuteSql {
int ExecuteSqlCommand(string sql, params object[] parameters);
IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters);
}

public interface IUnitOfWork : IExecuteSql, //...other interfaces
{
//...other code removed for brevity
}

实现将包装具体化

public class EntityFrameworkUnitOfWork : IUnitOfWork {

//...other code removed for brevity

public int ExecuteSqlCommand(string sql, params object[] parameters) {
return context.Database.ExecuteSqlCommand(sql, parameters);
}

public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters) {
return context.Database.SqlQuery<TElement>(sql, parameters);
}
}

所以现在在测试时IUnitOfWork可以使用您选择的模拟框架轻松模拟。

var mock = new Mock<IUnitOfWork>();

关于c# - 如何使用最小起订量模拟 Entity Framework DbRawSqlQuery 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42634374/

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