C# 如何验证ILogger.LogMessage中的错误?

C# 如何验证ILogger.LogMessage中的错误?,c#,moq,C#,Moq,我在ILogger中记录了一个错误 ILogger.LogMessage(Error, "Steps failed", System.Reflection.TargetParameterCountException: Parameter count mismatch. at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder,

我在ILogger中记录了一个错误

ILogger.LogMessage(Error, "Steps failed", System.Reflection.TargetParameterCountException: Parameter count mismatch.
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
我需要在单元测试中验证是否抛出了相同的错误。我怎样才能做到这一点。下面是我试图使用Mock做的事情

var expectedException = @""Steps failed", System.Reflection.TargetParameterCountException: Parameter count mismatch.
       at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture);

_Mocklogger.Verify(
                x =>
                    x.LogMessage(LogSeverity.Error, expectedException,
                        new System.Reflection.TargetParameterCountException(expectedException)), Times.Once);
但是,此操作失败,出现错误:

Moq.MockException : 
Expected invocation on the mock once, but was 0 times: x => x.LogMessage(LogSeverity.Error, "Parameter count mismatch.

看起来Moq正在尝试通过引用匹配
TargetParameterCountException
,但是,由于verify语句中的参数是新实例,因此永远不会匹配

试试看

\u Mocklogger.Verify(x=>x.LogMessage(LogSeverity.Error,
预期异常,
It.IsAny()),
次,一次),;
看看这是否是问题所在。 如果Moq与上面的匹配,并且如果您需要确保异常中的消息是正确的,那么您需要输入一个函数来检查异常内容

e、 g

\u Mocklogger.Verify(x=>x.LogMessage(LogSeverity.Error,
预期异常,
它是(CheckException)),
次,一次),;
私有静态布尔检查异常(System.Reflection.TargetParameterCountException ex){
//...
}
_Mocklogger.Verify(x =>x.LogMessage(LogSeverity.Error, 
                                    expectedException,
              It.IsAny<System.Reflection.TargetParameterCountException>()),
                                    Times.Once);
_Mocklogger.Verify(x =>x.LogMessage(LogSeverity.Error, 
                                    expectedException,
  It.Is<System.Reflection.TargetParameterCountException>(CheckException)),
                                    Times.Once);


private static bool CheckException(System.Reflection.TargetParameterCountException ex){
    //...
}