C# 验证在运行单元测试时作为参数传递给注入接口时对Func的调用

C# 验证在运行单元测试时作为参数传递给注入接口时对Func的调用,c#,moq,C#,Moq,我不确定在调用Func时验证是否调用了方法的最佳方法。使用下面的代码-我希望确保注入的iHirdPartyRapper调用注入的IInjectedInterface上的DoSomething。还有别的办法吗 [Test] public void Test() { var thirdPartyWrapperMock = new Mock<IThirdPartyWrapper>(); var injectedInterface =

我不确定在调用Func时验证是否调用了方法的最佳方法。使用下面的代码-我希望确保注入的iHirdPartyRapper调用注入的IInjectedInterface上的DoSomething。还有别的办法吗

    [Test]
    public void Test()
    {
        var thirdPartyWrapperMock = new Mock<IThirdPartyWrapper>();
        var injectedInterface = new Mock<IInjectedInterface>();
        injectedInterface.Setup(x => x.DoSomething()).Verifiable();

        bool called = false;
        thirdPartyWrapperMock.Setup(x => x.Execute(It.IsAny<Func<Context, IInjectedInterface>>(), It.IsAny<Dictionary<string, object>>())).Callback(() =>
            {
                called = true;
            });

        var tester = new ConsumerClass(thirdPartyWrapperMock.Object, injectedInterface.Object);

        tester.Execute();

        // The below call fails
        injectedInterface.VerifyAll();
        // called is false
        Assert.True(called);

    }

    public class ConsumerClass
    {
        private readonly IThirdPartyWrapper _thirdPartyWrapper;
        private readonly IInjectedInterface _injectedInterface;

        public ConsumerClass(IThirdPartyWrapper thirdPartyWrapper, IInjectedInterface injectedInterface)
        {
            _thirdPartyWrapper = thirdPartyWrapper;
            _injectedInterface = injectedInterface;
        }

        public void Execute()
        {
            _thirdPartyWrapper.Execute(x => _injectedInterface.DoSomething(), new Dictionary<string, object>());
        }
    }


    public interface IThirdPartyWrapper
    {
        TResult Execute<TResult>(
            Func<Context, TResult> action,
            IDictionary<string, object> contextData);
    }

    public interface IInjectedInterface
    {
        string DoSomething();
    }
[测试]
公开无效测试()
{
var thirdPartyWrapperMock=new Mock();
var injectedInterface=new Mock();
injectedInterface.Setup(x=>x.DoSomething()).Verifiable();
bool=false;
thirdPartyWrapperMock.Setup(x=>x.Execute(It.IsAny(),It.IsAny())。回调(()=>
{
调用=真;
});
var tester=新的ConsumerClass(第三方rappermock.Object,injectedInterface.Object);
tester.Execute();
//下面的调用失败
injectedInterface.VerifyAll();
//这是假的
Assert.True(调用);
}
公共类消费类
{
私人只读i第三方说唱人;
私有只读IInjectedInterface\u injectedInterface;
公共用户类(I第三方说话者第三方说话者,I注入接口注入接口)
{
_第三方振打器=第三方振打器;
_injectedInterface=injectedInterface;
}
public void Execute()
{
_第三方rapper.Execute(x=>_injectedInterface.DoSomething(),new Dictionary());
}
}
公共接口iHirdPartyRapper
{
TResult执行(
Func action,
词典上下文数据);
}
公共接口输入接口
{
字符串DoSomething();
}

要验证
Func
,您需要从
回调调用它。尝试按如下方式进行设置:

thirdPartyWrapperMock
    .Setup(x => x.Execute(It.IsAny<Func<Context, string>>(), It.IsAny<IDictionary<string, object>>()))
    .Callback<Func<Context, string>, IDictionary<string, object>>((func, dict) => func.Invoke(new Context()));
thirdPartyWrapperMock
.Setup(x=>x.Execute(It.IsAny(),It.IsAny()))
.Callback((func,dict)=>func.Invoke(newcontext());
与最初的方法相比,您会注意到一些差异:

  • 函数的返回值是
    string
    ,因为
    DoSomething()
    返回
    string
  • 该函数实际上已在回调中调用,否则无法验证它。
    上下文
    根本不重要,因为您没有使用它
  • 使用此设置,不再需要调用
    ,因为
    VerifyAll
    将确保调用该方法

您指的是编译器对out参数的警告/处理吗?或者运行时异常?我的意思是在运行单元测试时验证调用了正确的方法。我认为您的设置
thirdpartyrappermock
是错误的,实际上有两个错误:1)您返回的函数类型是
string
而不是
IInjectedInterface
2)您没有在回调中调用
函数。。。