Moq.Dapper QueryAsync 不适用于模拟交易对象

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

Nko*_*osi 5

根据异常消息,QueryAsync扩展方法似乎利用了DbTransaction

所以用摘要DbTransaction代替,它就会通过。

TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()

//...

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

//...
Run Code Online (Sandbox Code Playgroud)

在提供的小提琴上测试它并且它有效。