[英]Moq.Dapper QueryAsync does not work with mocked transaction object
I am trying to test my repository method which uses QueryAsync() and it is under a transaction. 我正在尝试测试使用QueryAsync()的存储库方法,并且该方法在事务下。 So I am mocking IDbConnection as well as IDbTransaction. 所以我在嘲笑IDbConnection以及IDbTransaction。 But when I run the test case it gives an error 但是当我运行测试用例时,它给出了一个错误
"Unable to cast object of type 'Castle.Proxies.IDbTransactionProxy' to type 'System.Data.Common.DbTransaction'" “无法将类型为'Castle.Proxies.IDbTransactionProxy'的对象转换为类型为'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();
}
} }
You can also run it on fiddle to reproduce same issue https://dotnetfiddle.net/40lMbh 您也可以在小提琴上运行它以重现相同的问题https://dotnetfiddle.net/40lMbh
Based on the exception message it appears the QueryAsync
extension method makes use of DbTransaction
根据异常消息,看起来QueryAsync
扩展方法使用了DbTransaction
So use the abstract DbTransaction
instead and it will pass. 因此,请改用抽象的DbTransaction
,它会通过。
TestMoqDapperExecuteAsyncIDbConnectionWithTransaction() TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()
//...
var tran = new Mock<DbTransaction>(); //<--Note abstract class instead of interface
//...
Tested it on the provided fiddle and it works. 在提供的小提琴上对其进行了测试,并且可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.