Moq.Dapper QueryAsync 不适用于模拟事务对象
Moq.Dapper QueryAsync does not work with mocked transaction object
我正在尝试测试我的存储库方法,它使用 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 上对其进行了测试并且有效。
我正在尝试测试我的存储库方法,它使用 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 上对其进行了测试并且有效。