其他分享
首页 > 其他分享> > 我可以重用它吗?Moq中的任何参数描述符

我可以重用它吗?Moq中的任何参数描述符

作者:互联网

我有一些类似于

FooMock.Setup( m => m.Bar( It.Is<BarArg>( x => long_test_x_is_ok(x) ) );

天真的,我认为我可以将其重写为:

var barArg = It.Is<BarArg>( x => long_test_x_is_ok(x) );
FooMock.Setup( m => m.Bar( barArg ) );

但是起订量不爱我.有可能这样做吗?

同样,我们的某些类名也很长.我想重构对

It.IsAny<AnnoyinglyLongClassNameHere>()

变成更短的东西

var anyAlcnh = It.IsAny<AnnoyinglyLongClassNameHere>;

似乎也不起作用.

解决方法:

它不起作用的原因是安装程序实际上接收的是Expression<Action<IFoo>>,而不仅仅是Action< IFoo>.

它从不实际调用您传入的Action,它所做的是将表达式取下来,将其拆开并解析每个组成部分.因此,您不能拔出barArg,因为这会使barArg成为表达式解析器的“黑匣子”,并且不知道变量代表什么.

你能做的最好的就是

//Assuming Bar has the signature "void Bar(BarArg barArg)". 
//If it was "Baz Bar(BarArg barArg)" use "Expression<Func<IFoo, Baz>>" instead.
Expression<Action<IFoo>> setup =  m => m.Bar(It.Is<BarArg>(x => long_test_x_is_ok(x)));
FooMock.Setup(setup);

IsAny也有同样的问题,但是您可以使用别名来缩短类名.

//At the top of your file with your other using statements
using ShortName = Some.Namespace.AnnoyinglyLongClassNameHere;

//Down in your unit test
FooMock.Setup(m => m.Bar(It.IsAny<ShortName>());

标签:unit-testing,moq,c,net
来源: https://codeday.me/bug/20191120/2045243.html