gpt4 book ai didi

c# - Moq.Dapper QueryAsync 不适用于模拟事务对象

转载 作者:行者123 更新时间:2023-11-30 21:27:21 30 4
gpt4 key购买 nike

我正在尝试测试我的存储库方法,它使用 QueryAsync() 并且它在一个事务中。所以我在模拟 IDbConnection 和 IDbTransaction。但是当我运行测试用例时它给出了一个错误

"Unable to cast object of type 'Castle.Proxies.IDbTransactionProxy' to type 'System.Data.Common.DbTransaction'"

using System;
using Dapper;
using Moq;
using Moq.Dapper;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Collections.Generic;

public class Program
{
public class ComplexType
{
public string StringProperty { get; set; }
public int IntegerProperty { get; set; }
}


private static void TestMoqDapperExecuteAsyncIDbConnectionWithoutTransaction()
{
var connection = new Mock<IDbConnection>();

connection.SetupDapperAsync(c => c.QueryAsync<int>(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<IDbTransaction>(), It.IsAny<int>(), It.IsAny<CommandType>()))
.ReturnsAsync(new List<int>
{
5
});

var result = connection.Object
.QueryAsync<int>("")
.GetAwaiter()
.GetResult();

Console.WriteLine(string.Format(" Test without transaction {0}", result.Count() != 0 ? "PASSED" : "FAILED"));
}

private static void TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()
{
var connection = new Mock<IDbConnection>();
var tran= new Mock<IDbTransaction>();

connection.SetupDapperAsync(c => c.QueryAsync<int>(It.IsAny<string>(), It.IsAny<object>(), It.IsAny<IDbTransaction>(), It.IsAny<int>(), It.IsAny<CommandType>()))
.ReturnsAsync(new List<int>
{
5
});

var result = connection.Object
.QueryAsync<int>("",null,tran.Object)
.GetAwaiter()
.GetResult();

Console.WriteLine(string.Format("Test with transaction {0}", result.Count() != 0 ? "PASSED" : "FAILED"));
}

public static void Main()
{
TestMoqDapperExecuteAsyncIDbConnectionWithoutTransaction();
TestMoqDapperExecuteAsyncIDbConnectionWithTransaction();
}

您也可以在 fiddle 上运行它以重现相同的问题 https://dotnetfiddle.net/40lMbh

最佳答案

根据异常消息,QueryAsync 扩展方法使用了 DbTransaction

因此请改用抽象DbTransaction,它将通过。

TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()

//...

var tran = new Mock<DbTransaction>(); //<--Note abstract class instead of interface

//...

在提供的 fiddle 上对其进行了测试,它有效。

关于c# - Moq.Dapper QueryAsync 不适用于模拟事务对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57884909/

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