2016-09-15 107 views
2

我有一个Moq模拟的类,我需要验证某个方法是否被调用。根据变量的类型,我需要检查该方法是被调用过的还是从不被调用。C#三元运算符不工作

所以,这个工程:

if (exception is ValidationException) 
    mockRequestHandler.Verify(x => x.HandleException(exception), 
    Times.Once); 
else 
    mockRequestHandler.Verify(x => x.HandleException(exception), 
    Times.Never); 

我想如下使用三元运算符,但它似乎并没有工作:

mockRequestHandler.Verify(x => x.HandleException(exception), 
    (exception is ValidationException) ? Times.Once: Times.Never); 

我得到编译期以下时间错误:

Type of conditional expression cannot be determined because there is no implicit conversion between 'method group' and 'method group'.

有没有简单的东西我忽略或可以三元操作符不能用于这种方式?

+1

为什么首先不要进行异常检查?例如。 '(异常是ValidationException)? mockRequestHandler.Verify(x => x.HandleException(exception),Times.Once):mockRequestHandler.Verify(x => x.HandleException(exception),Times.Never);'。它似乎几乎只要你的原始,但参考这个链接:[使用条件(?:)运算符在C#(3.0)中的方法选择?](http://stackoverflow.com/questions/5186394/using-条件操作符为方法选择在C - 尖-3-0) –

+2

您能请指定'验证','Times.Once'和'Times.Never'类型签名? –

+0

您应该能够将其中一个操作数转换为Func来解决它 –

回答

6

正如我在this source file中看到的,Times.OnceTimes.Never实际上是静态方法,但不是属性。

为了验证该方法被调用一次或不会被调用,你需要使用这种方式:

mockRequestHandler.Verify(x => x.HandleException(exception), Times.Once()); 
mockRequestHandler.Verify(x => x.HandleException(exception), Times.Never()); 

所以,使用三元操作将是:

mockRequestHandler.Verify(x => x.HandleException(exception), 
    (exception is ValidationException) ? Times.Once() : Times.Never()); 
+0

这可能是moq case的错误建议。验证第二个参数的类型确认 –

+1

[在第28行验证](https://github.com/moq/moq4/blob/756bf4e3e7b213c6d819ae7acd5e04280a07a040/UnitTests/ExtensionsFixture.cs) – txtechhelp

+1

@AlexeiLevenkov谢谢你的建议。我从来没有使用Moq,但我已经看到GitHub上的这种用法,并且[这里](http://stackoverflow.com/questions/4206193/how-do-i-verify-a-method-was-called-exactly-曾经有-MOQ)。如果OP尝试了这一点,它不会工作,我会删除我的答案:) –