C# 如何模拟返回void但修改传入的引用类型的方法?

C# 如何模拟返回void但修改传入的引用类型的方法?,c#,mocking,C#,Mocking,我有一个像- public interface ILedgerStoreRepository { void AddInvoiceDetailsToBatchWriteObj(ref BatchWrite<InvoiceDetailsDAO> batchWriteDetails, ref InvoiceDetailsDAO invoiceDetails); } 公共接口ILedgerStoreRepository { 无效AddInvoiceDetailsTo

我有一个像-

public interface ILedgerStoreRepository
{
    void AddInvoiceDetailsToBatchWriteObj(ref BatchWrite<InvoiceDetailsDAO> batchWriteDetails,
        ref InvoiceDetailsDAO invoiceDetails);
}
公共接口ILedgerStoreRepository
{
无效AddInvoiceDetailsToBatchWriteObj(参考BatchWrite batchWriteDetails,
参考发票详情(发票详情);
}
我想以这样的方式模拟此函数:我只想验证invoiceDetails值作为我的验证。目前我正在像这样尝试-

    var repoMock = new Mock<ILedgerStoreRepository>();
    repoMock.Setup(m =>
        m.AddInvoiceDetailsToBatchWriteObj(ref batchWriteObj1,
            ref It.Ref<InvoiceDetailsDAO>.IsAny)).Callback<BatchWrite<InvoiceDetailsDAO>, InvoiceDetailsDAO>(
        (write, dao) =>
        {
            Assert.Equal(LedgerStoreTestConstants.TestInvoiceDetailsMappingDao, dao);
        }).Verifiable();
var repoMock=new Mock();
repoMock.Setup(m=>
m、 AddInvoiceDetailsToBatchWriteObj(参考batchWriteObj1,
ref It.ref.IsAny)回调(
(写,道)=>
{
Assert.Equal(账本存储测试常量.TestInvoiceDetailsMappingDao,dao);
}).可验证();
但这让我犯了以下错误-

System.ArgumentException 无效的回调。带有参数(ref BatchWrite,ref InvoiceDetailsDAO)的方法上的安装程序无法使用参数(BatchWrite,InvoiceDetailsDAO)调用回调


有人能帮我吗?

我稍微修改了输入参数,以便能够测试它

public interface ILedgerStoreRepository
{
        void AddInvoiceDetailsToBatchWriteObj(ref List<string> batchWriteDetails, ref string invoiceDetails);
}

public class TestClass
{
    public void Execute(ILedgerStoreRepository repo)
    {
        List<string> a = new List<string> { "Test", "Alpha" };
        string b = "Alpha";
        repo.AddInvoiceDetailsToBatchWriteObj(ref a, ref b);
    }
}

// You need this delegate
delegate void AddInvoiceCallback(ref List<string> batchWriteDetails, ref string invoiceDetails);

[Test]
public void DummyTest()
{
    var repoMock = new Mock<ILedgerStoreRepository>();
    repoMock.Setup(m =>
                     m.AddInvoiceDetailsToBatchWriteObj(ref It.Ref<List<string>>.IsAny,
                                                              ref It.Ref<string>.IsAny))
                .Callback(new AddInvoiceCallback((ref List<string> batch, ref string details)
            =>
            {
                Assert.That(batch.Contains("Test"));
            })).Verifiable();

    // Act   
    new TestClass().Execute(repoMock.Object);
}
公共接口ILedgerStoreRepository
{
作废AddInvoiceDetailsToBatchWriteObj(参考列表batchWriteDetails,参考字符串invoiceDetails);
}
公共类TestClass
{
公共作废执行(IledgerStoreRepo)
{
列表a=新列表{“Test”,“Alpha”};
字符串b=“Alpha”;
报告书附录a、附录b;
}
}
//你需要这个代表
委托无效AddInvoiceCallback(参考列表batchWriteDetails,参考字符串invoiceDetails);
[测试]
公共无效测试()
{
var repoMock=new Mock();
repoMock.Setup(m=>
m、 AddInvoiceDetailsToBatchWriteObj(参考It.ref.IsAny,
参考它,参考IsAny)
.Callback(新的AddInvoiceCallback((参考列表批次,参考字符串详细信息)
=>
{
断言(批次包含(“测试”));
})).可验证();
//表演
新建TestClass().Execute(repoMock.Object);
}

您需要使用自定义委托类型来实现此目的。检查这个