【问题标题】:Moq.Dapper QueryAsync does not work with mocked transaction objectMoq.Dapper QueryAsync 不适用于模拟事务对象
【发布时间】:2019-09-11 08:15:43
【问题描述】:

我正在尝试测试我的存储库方法,它使用 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();
}

}

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

【问题讨论】:

  • 只要使用抽象DbTransaction就可以了。在你的小提琴上测试过,它可以工作

标签: c# unit-testing .net-core moq dapper


【解决方案1】:

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

所以使用 abstractDbTransaction 代替它会通过。

TestMoqDapperExecuteAsyncIDbConnectionWithTransaction()

//...

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

//...

在提供的小提琴上对其进行了测试,并且可以正常工作。

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    相关资源
    最近更新 更多