moq 相关问题

Moq(发音为“Mock-you”或只是“Mock”)是.NET的一个模拟框架,它大量使用lambdas和LINQ表达式树。






如何使用moq.dapper<dynamic>模拟QueryAsync

我们有一个下面的类,可以在参数中提供的表中找到记录,然后在事务中删除它们。 公共异步任务 我们有一个下面的类,可以在参数中提供的表中找到记录,然后在事务中删除它们。 public async Task<IEnumerable<DataTableRecordsResponse>> DeleteDataAsync(string tenantId) { if (string.IsNullOrEmpty(tenantId)) { throw new ArgumentNullException(nameof(tenantId)); } var deletedRecords = new List<DataTableRecordsResponse>(); try { using (IDbConnection conn = _sqlDbConnection.CreateConnection()) { conn.Open(); using (IDbTransaction transaction = conn.BeginTransaction()) { try { foreach (string table in s_allowedTableName) { string selectQuery = $"SELECT * FROM {table} WHERE TenantId = @tenantId;"; IEnumerable<dynamic> records = await _dapperWrapper.QueryAsync<dynamic>(conn, selectQuery, new { tenantId }, transaction); deletedRecords.Add(new DataTableRecordsResponse(table, records)); if (records.Any()) { string deleteCommand = $"DELETE FROM {table} WHERE TenantId = @tenantId; "; await _dapperWrapper.ExecuteAsync(conn, deleteCommand, new { tenantId }, transaction); } } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); _logger.LogException(ex); throw; } finally { _logger.LogEvent("Tenant data purge operation completed"); } } } } catch (Exception ex) { _logger.LogException(ex); throw; } return deletedRecords; } } 我正在尝试使用以下代码模拟QueryAsync,但是,它返回null: [TestMethod] public async Task Successful_Transaction_Should_Complete_Transaction_And_Return_Deleted_Records() { //Arrange _sqlDbConnection.Setup(c => c.CreateConnection()).Returns(_dbMock.Object); _bulkOperationHelper = new BulkOperationHelper(_sqlDbConnection.Object, _loggerMock.Object); _dbMock.SetupDapperAsync(c => c.QueryAsync<dynamic>(It.IsAny<string>(), It.IsAny<object>(), null, null, null)) .ReturnsAsync(_results); _dbMock.SetupDapper(c => c.ExecuteScalar(It.IsAny<string>(), It.IsAny<object>(), null, null, null)) .Returns(0); //Act List<DataTableRecordsResponse> deletedRecords = await _bulkOperationHelper.TenantDecommissioningBatchDelete(_tenantId, _tables); //Assert Assert.IsNotNull(deletedRecords); Assert.IsTrue(deletedRecords.Count > 0); Assert.IsTrue(deletedRecords.Count == 0); } thiseythe thiseytory似乎有一个关于此事的dapper存储库中的开放式。 由于不可能嘲笑QueryAsync,可以在以下添加到涂层库的包装类别。 public class DapperWrapper : IDapperWrapper { public async Task<IEnumerable<T>> QueryAsync<T>(IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null) { return await connection.QueryAsync<T>(sql, param, transaction); } public async Task<int> ExecuteAsync(IDbConnection connection, string sql, object param = null, IDbTransaction transaction = null) { return await connection.ExecuteAsync(sql, param, transaction); } } 在单元测试中,类和IT方法可以被模拟如下: [TestMethod] public async Task DeleteDataAsync_ShouldCommitTransaction_WhenAllTablesProcessed() { foreach (string table in AllowedTables) { SetupMockForTableWithRecords(_mockConnection, _mockTransaction, _tenantId, table); } IEnumerable<DataTableRecordsResponse> result = await _tenantDataPurgeHelper.DeleteDataAsync(_tenantId); AssertResultsAndCommit(result); _mockTransaction.Verify(x => x.Commit(), Times.Once); } private void SetupMockForTableWithRecords(Mock<IDbConnection> mockConnection, Mock<IDbTransaction> mockTransaction, string tenantId, string table) { _mockDapperWrapper .Setup(x => x.QueryAsync<dynamic>(mockConnection.Object, $"SELECT * FROM {table} WHERE TenantId = @tenantId;", It.Is<object>(p => p.Equals(new { tenantId })), mockTransaction.Object)) .ReturnsAsync(new List<dynamic> { new { Id = 1, TenantId = tenantId } }); _mockDapperWrapper .Setup(x => x.ExecuteAsync(mockConnection.Object, $"DELETE FROM {table} WHERE TenantId = @tenantId;", It.Is<object>(p => p.Equals(new { tenantId })), mockTransaction.Object)) .ReturnsAsync(1); }

回答 1 投票 0

为什么我在完成所有案例后仍未获得 100% 的代码覆盖率?

这是我的查询类: 公共类 GetRolesQuery :GenericDetailsPaginatedQueryBase { 公共字符串[] OrganizationIds { 获取;放; } = []; 公共日期时间?从日期 { 得到;放; } 公开

回答 1 投票 0

如何模拟对象来测试依赖于接口具体实现的方法

在下面的示例中,我有一个取决于接口的具体类型的方法。如何测试 .Eat 是否被 Moq 调用? 公共接口 IAnimal { 无效吃(); } 公共...

回答 2 投票 0

在mstest单元测试中验证Hangfire中的BackgroundJob.Delete

我有一个 CancelScheduledJob 方法,获取后台作业的 Id 并使用 JobStorage 检索此 Id 并取消匹配的 Hangfire 作业: var mon = JobStorage.Current.

回答 1 投票 0

为什么该方法不起作用,但相同的算法在另一种方法中却有效?

我有一个带有实体框架的数据库,使用存储库设计模式。我的存储库中有一个方法,它获取两个输入,一个实体和一个 IQuerable 集合。该方法算法...

回答 1 投票 0

为什么当 Moq 的 Strict 行为抛出在测试代码下的系统中捕获的异常时,xUnit 测试会通过?

我发现 xUnit 和 Moq 的 Strict 行为存在一个微妙但重要的问题,可能会导致假阳性测试结果。这是场景: 测试设置 将 Moq 与 MockBehavior.Strict 结合使用

回答 1 投票 0

如何使用moq模拟MySqlConnection

我正在尝试使用 Moq 模拟 MySqlConnection,它抛出以下错误: System.NotSupportedException: '要模拟的类型 (MySqlConnection) 必须是接口、委托或非密封...

回答 1 投票 0

如何在单元测试中模拟控制器上下文,以便我对字符串函数的部分视图起作用?

我正在尝试为我的控制器创建一个单元测试,但是我正在测试的操作使用了字符串函数的部分视图,该函数不想在我的测试中工作。 私有字符串

回答 3 投票 0

如何模拟 MediatR 来对 Web API 控制器执行 xUnit 测试

我正在尝试为控制器方法配置 xUnit 测试。在我的控制器中,我使用 MediatorR 进行处理程序调用。我已经创建了 mediatorR Handler 的固定装置并设置返回预期对象...

回答 3 投票 0

如何模拟container.Resolve<Type>()

我有这样的事情: 公共类 HomeController { 公共 ActionResult Index() { var x = Container.Resolve(); } } 当单元测试时,我得到一个 null

回答 4 投票 0

如何模拟HttpClient.GetFromJsonAsync?

我有一些调用 HttpClient 的 GetFromJsonAsync 的代码,但是我正在努力模拟方法调用,并且想知道如何做到这一点? C#代码: 公共类客户端:IClient { 私人

回答 3 投票 0

带有类代理尝试的 Moq 完全通用设置会抛出“无法执行后期绑定操作”

需要解决的问题 我正在尝试使用 Moq 库创建接口 ISomeService 的模拟,它将包装其真正的实现 SomeService。 现在我正在手动执行此操作,如下所示: var insta...

回答 1 投票 0

当我的 SUT 依赖于 TimeProvider 时,如何使用 AutoFixture 属性来获取 FakeTimeProvider 参考

假设我有一个依赖于 TimeProvider 的服务。 我现在使用 AutoFixture 和 Moq 设置 FakeTimeProvider 进行测试的方法是: 公共类 FakeTimeProviderCustomization :

回答 1 投票 0

如何在不显式指定或使用重载的情况下 Moq 签名中包含可选参数的方法?

给出以下界面: 公共接口 IFoo { bool Foo(字符串 a, bool b = false); } 尝试使用 Moq 来模拟它: var mock = new Mock(); 模拟.Setup(模拟 => 模拟.Fo...

回答 7 投票 0

Moq 验证属性初始化

如何使用最小起订量验证初始化调用?我在接口中定义了以下属性: 公共字符串文本{初始化; } 我想验证是否使用特定参数调用了 init。是这样吗

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.