Viv*_*rma 4 c# unit-testing moq dapper .net-core
我正在尝试测试我的存储库方法,该方法使用 QueryAsync() 并且它位于事务下。所以我在嘲笑 IDbConnection 和 IDbTransaction。但是当我运行测试用例时它给出了错误
“无法将‘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();
}
Run Code Online (Sandbox Code Playgroud)
}
您还可以在小提琴上运行它来重现相同的问题https://dotnetfiddle.net/40lMbh
根据异常消息,QueryAsync扩展方法似乎利用了DbTransaction
所以用摘要DbTransaction代替,它就会通过。
TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()
//...
var tran = new Mock<DbTransaction>(); //<--Note abstract class instead of interface
//...
Run Code Online (Sandbox Code Playgroud)
在提供的小提琴上测试它并且它有效。
| 归档时间: |
|
| 查看次数: |
8093 次 |
| 最近记录: |