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