我可以重用它吗?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