【问题标题】:Test method with param Action<T> with Nunit and Moq c#带有参数 Action<T> 和 Nunit 和 Moq c# 的测试方法
【发布时间】:2021-08-25 13:36:13
【问题描述】:

我正在使用 c#、Nunit 和 Moq,并且我想测试像 Remove() 方法这样的方法,它使用 Action 参数调用另一个方法。

public class Db
{
    private readonly IMessageWrapper _messageWrapper;
    private readonly IProvider _provider;

    public Db(IMessageWrapper messageWrapper, IProvider provider)
    {
        _messageWrapper = messageWrapper;
        _provider = provider;
    }

    public void Remove()
    {
      Execute(transaction => 
      {
         // Do something

         // method to verify with unit test
         _messageWrapper.SendData();
      });
    }

    private void Execute(Action<SqlTransaction> action)
    {
       _provider.ExecuteAction(action);
    }
}

我想做这样的事情:

public class DbTest
{
    [Test]
    public void Remove_Should_SendData()
    {
        //... create IMessageWrapper mock and IProvider mock...
        var db = new Db(messageWrapperMock.Object, provider.Object);
        
        provider.Setup(p => p.ExecuteAction(It.IsAny<Action<SqlTransaction>>));

        db.Remove();
        
        messageWrapperMock.Verify(m => m.SendData(), Times.Once());
    }
}

但它不起作用。单元测试没有到达_messageWrapper.SendData();

感谢您的帮助

【问题讨论】:

    标签: c# .net unit-testing nunit moq


    【解决方案1】:

    当您 setup 没有任何代码时 - 该方法什么也不做,但您需要它来调用您的操作。 试试这个:

    provider.Setup(p => p.ExecuteAction(It.IsAny<Action<SqlTransaction>>()))
      .Callback<Action<SqlTransaction>>(c => c(null));
    

    【讨论】:

    • @juharr 这是一个带有SqlTransaction 参数的动作。你把它误认为 Func
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2015-03-15
    • 2016-09-21
    • 2018-08-23
    相关资源
    最近更新 更多