- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写单元测试用例,并且成功地为 Query
编写了单元测试用例。但是我没有为 QueryMultiple
编写单元测试用例。
对于查询,我是这样写的:
IEnumerable<ClientTestPurpose> fakeTestPurposes = new
List<ClientTestPurpose>()
{
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name1"},
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name2"},
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name3"}
};
_mock.SetupDapper(x => x.Query<ClientTestPurpose>(It.IsAny<string>(), null, null, true, null, null)).Returns(fakeTestPurposes);
var result = _libraryRepository.TestPurposes(clientModal.Id);
Assert.IsNotNull(result);
Assert.AreEqual(result.Count(), fakeTestPurposes.Count());
如何为QueryMultiple
编写:
using (var multi = _db.QueryMultiple(spName, spParams, commandType: CommandType.StoredProcedure))
{
var totals = multi.Read<dynamic>().FirstOrDefault();
var aggregates = multi.Read<StatusModel>();
var scripts = multi.Read<LibraryItemModel>();
var runs = multi.Read<RunSummaryModel>();
var filteredTotals = multi.Read<dynamic>().FirstOrDefault();
}
最佳答案
显然您使用了 Moq.Dapper 扩展。以下是 SetupDapper
和 SetupDapperAsync
方法的代码:
public static ISetup<IDbConnection, TResult> SetupDapper<TResult>(this Mock<IDbConnection> mock, Expression<Func<IDbConnection, TResult>> expression)
{
MethodCallExpression body = expression.Body as MethodCallExpression;
if ((body != null ? body.Method.DeclaringType : (Type) null) != typeof (SqlMapper))
throw new ArgumentException("Not a Dapper method.");
string name = body.Method.Name;
if (name == "Execute")
return (ISetup<IDbConnection, TResult>) DbConnectionInterfaceMockExtensions.SetupExecute(mock);
if (name == "ExecuteScalar")
return DbConnectionInterfaceMockExtensions.SetupExecuteScalar<TResult>(mock);
if (name == "Query" || name == "QueryFirstOrDefault")
return DbConnectionInterfaceMockExtensions.SetupQuery<TResult>(mock);
throw new NotSupportedException();
}
public static ISetup<IDbConnection, Task<TResult>> SetupDapperAsync<TResult>(this Mock<IDbConnection> mock, Expression<Func<IDbConnection, Task<TResult>>> expression)
{
MethodCallExpression body = expression.Body as MethodCallExpression;
if ((body != null ? body.Method.DeclaringType : (Type) null) != typeof (SqlMapper))
throw new ArgumentException("Not a Dapper method.");
if (body.Method.Name == "QueryAsync")
return DbConnectionInterfaceMockExtensions.SetupQueryAsync<TResult>(mock);
throw new NotSupportedException();
}
如您所见,Moq.Dapper 仅支持对 Execute
、ExecuteScalar
、Query
和 QueryAsync
方法进行模拟.因此,您可能会在尝试模拟 QueryMultiple
时遇到 NotSupportedException
。要模拟数据库行为,您可能需要首先引入另一个抽象级别,正如@TrueWill 在评论中所说。这只是您的情况下的想法示例:
[Test]
public void DoSomethingWithQueryTest()
{
// Arrange
IEnumerable<ClientTestPurpose> fakeTestPurposes = new
List<ClientTestPurpose>
{
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name1" },
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name2" },
new ClientTestPurpose { PurposeID = 1, PurposeName = "Test Purpose name3" }
};
var mock = new Mock<ILibraryRepository>();
mock.Setup(x => x.TestPurposes(It.IsAny<int>())).Returns(fakeTestPurposes);
var logicService = new SomeLogicService(mock.Object);
// Act
var result = logicService.DoSomethingWithQuery(1);
// Assert
Assert.IsNotNull(result);
Assert.AreEqual(result.Count(), fakeTestPurposes.Count());
}
[Test]
public void DoSomethingWithQueryMultipleTest()
{
// Arrange
SomeAggregate fakeTestPurposes = new SomeAggregate();
var mock = new Mock<ILibraryRepository>();
mock.Setup(x => x.TestQueryMultiple()).Returns(fakeTestPurposes);
var logicService = new SomeLogicService(mock.Object);
// Act
var result = logicService.DoSomethingWithQueryMultiple();
// Assert
Assert.IsNotNull(result);
}
public interface ILibraryRepository
{
IEnumerable<ClientTestPurpose> TestPurposes(int id);
SomeAggregate TestQueryMultiple();
}
public class LibraryRepository : ILibraryRepository
{
private readonly IDbConnection _db;
public LibraryRepository(IDbConnection db)
{
_db = db ?? throw new ArgumentNullException(nameof(db));
}
public IEnumerable<ClientTestPurpose> TestPurposes(int id)
{
return _db.Query<ClientTestPurpose>("SQL here", new { id }, null, true, null, null);
}
public SomeAggregate TestQueryMultiple()
{
string spName = "SQL here";
var spParams = new { Id = 1 };
using (var multi = _db.QueryMultiple(spName, spParams, commandType: CommandType.StoredProcedure))
{
return new SomeAggregate
{
totals = multi.Read<dynamic>().FirstOrDefault(),
aggregates = multi.Read<StatusModel>(),
scripts = multi.Read<LibraryItemModel>(),
runs = multi.Read<RunSummaryModel>(),
filteredTotals = multi.Read<dynamic>().FirstOrDefault()
};
}
}
}
public class SomeAggregate
{
public IEnumerable<dynamic> totals { get; set; }
public IEnumerable<StatusModel> aggregates { get; set; }
public IEnumerable<LibraryItemModel> scripts { get; set; }
public IEnumerable<RunSummaryModel> runs { get; set; }
public IEnumerable<dynamic> filteredTotals { get; set; }
}
/// <summary>
/// Example logic server, that just returns results from repository
/// </summary>
public class SomeLogicService
{
private readonly ILibraryRepository _repo;
public SomeLogicService(ILibraryRepository repo)
{
_repo = repo;
}
public IEnumerable<ClientTestPurpose> DoSomethingWithQuery(int id)
{
return _repo.TestPurposes(id);
}
public SomeAggregate DoSomethingWithQueryMultiple()
{
return _repo.TestQueryMultiple();
}
}
主要思想是将所有数据库特定的东西隐藏在 ILibraryRepository
后面,并将您需要测试的所有逻辑移动到某个逻辑服务器,该服务器将接收存储库作为依赖项。为了存储库中的代码应该简单、明显,包含所有 DB 特定逻辑:连接、事务、命令、对象关系映射等。并且您不需要用 unt 测试覆盖这些代码。然而,你确实用单元测试覆盖了 SomeLogicService
的代码,因为这是你真正需要测试的。你会看到 Dapper 扩展方法是相当低级的抽象,它没有隐藏使用 DB 的细节,它们只是帮助者。希望能帮助到你。
关于unit-testing - 如何使用 Moq.Dapper 模拟 QueryMultiple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52414562/
我正在使用 QueryMultiple 执行存储过程以返回多组数据。 var gridReader = db.QueryMultiple("sp",
我在Dapper官方文档中看到了QueryMultiple,如下所示,很方便! var sql = @" select * from Customers where CustomerId =
我正在尝试将多对多关系映射到具有角色列表的用户 我试过做这个问题Dapper Many-to-Many Query但它给了我多个用户,每个用户都有一个角色。 相反,我尝试使用 QueryMultipl
我正在尝试在 dapper 上创建一个层,并想创建一个使用 QueryMultiple 方法的方法。我想使用 QueryMultiple 的 Read 方法以字符串格式(在运行时确定)映射传入的类型列
我有一个采用可选参数的存储库方法,它可能返回也可能不返回任何记录。如果查询返回记录,一切正常,但如果没有结果,那么我会在 Dapper 中抛出异常。 connection 或 multi 上似乎没有方
我写了两段 SQL 命令,想在一个查询中处理,如下所示: SELECT COUNT(*) FROM books SELECT * FROM books ORDER BY bookID OFFSET 1
我正在尝试将 dapper 与 Oracle (ODP.NET) 一起使用,并且我想使用“QueryMultiple”功能。 将此字符串传递给 QueryMultiple 方法: var query
我在 .net 4.5 代码(并行库)中使用 Dapper QueryMultiple/Query/Execute 方法,我想知道它是否是线程安全的。 谢谢, 莫妮卡 最佳答案 dapper 的所有内
我目前使用Query<>查询8次(8 次,因为我必须将一些列转换为 JSON,有时需要单独转换)以生成所需的完整结果集。但是,我想知道是否可以通过使用 QueryMultiple 来提高性能。我有一个
同时使用 Dapper 进行多个查询: var result = sqlConnection.QueryMultiple(query, Parameters, commandType: comman
衣冠楚楚 documentation声明您可以一次发送多个查询并使用 QueryMultiple 方法迭代结果,如下所示: var sql = @" select * from foo where i
我有几个需要一起运行的查询,我可以使用 QueryMultiple 功能来实现。 但在这种情况下,我无法找出如何使用 MultiMapping。 有谁知道实现这一目标的方法? 最佳答案 我认为这就是您
我正在编写单元测试用例,并且成功地为 Query 编写了单元测试用例。但是我没有为 QueryMultiple 编写单元测试用例。 对于查询,我是这样写的: IEnumerable fakeTest
我正在编写单元测试用例,并且成功地为 Query 编写了单元测试用例。但是我没有为 QueryMultiple 编写单元测试用例。 对于查询,我是这样写的: IEnumerable fakeTest
使用 dapper,我可以对存储过程执行批处理,类似于: connection.Execute(@" exec sp1 @i = @one, @y = @two exec sp2 @i = @
所以我正在尝试使用 Dapper micro-ORM 从 Web 应用程序执行 pl/pgSQL 函数。无论我在 QueryMultiple 方法中作为参数传递的值如何,我总是得到空值;尽管在数据库中
我很难在互联网上找到这个... 我需要在 Dapper + MySQL 中运行一个 QueryMultiple 命令,查询在 SQL Server 中看起来像这样: DECLARE @clientDo
我们最近构建了一个映射类,称为 TableMapperT,它封装了我们的 Dapper 多映射函数。我们将它与我们的“命令”对象分开构建,称为 TableCommand,它保存 sql 文本信息等。然
我有一个 Dapper.NET 的 QueryMultiple 方法的包装器方法。它成功地从一个存储过程中获取数据,该存储过程有 3 个查询,它们都是 SELECT 查询。但是在获取数据后,我无法使用
我是一名优秀的程序员,十分优秀!