我可以在 Moq 中重用 It.Any 参数描述符吗
Can I reuse It.Any argument descriptors in 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 ) );
但是最小起订量不爱我。有没有办法做到这一点?
同样,我们的某些 class 名称也很长。我想重构对
的调用
It.IsAny<AnnoyinglyLongClassNameHere>()
缩短一些
var anyAlcnh = It.IsAny<AnnoyinglyLongClassNameHere>;
好像也没用。
它不起作用的原因是 Setup
实际上接受了 Expression<Action<IFoo>>
而不仅仅是 Action<IFoo>
。
它实际上从未调用您传入的 Action
,它所做的是获取表达式,将其拆开并解析每个组件。因此,您不能提取 barArg
,因为这会使 barArg
成为表达式解析器的 "black box",并且不知道变量代表什么。
你能做的最好的就是
//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 有同样的问题,但是为此你可以创建一个别名来缩短 class 名称。
//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>());
我有一些类似于
的代码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 ) );
但是最小起订量不爱我。有没有办法做到这一点?
同样,我们的某些 class 名称也很长。我想重构对
的调用It.IsAny<AnnoyinglyLongClassNameHere>()
缩短一些
var anyAlcnh = It.IsAny<AnnoyinglyLongClassNameHere>;
好像也没用。
它不起作用的原因是 Setup
实际上接受了 Expression<Action<IFoo>>
而不仅仅是 Action<IFoo>
。
它实际上从未调用您传入的 Action
,它所做的是获取表达式,将其拆开并解析每个组件。因此,您不能提取 barArg
,因为这会使 barArg
成为表达式解析器的 "black box",并且不知道变量代表什么。
你能做的最好的就是
//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 有同样的问题,但是为此你可以创建一个别名来缩短 class 名称。
//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>());