带有匿名值的广义Func包装等效于AutoFixture’With’

在基于AutoFixture的测试中,我试图尽可能干净地表达以下内容:

当我将传递给此方法的参数x时,匿名填写其他参数,结果是……

以工厂方法为例: –

 class X { public static X Create( Guid a, Guid b, Guid c, String x, String y); 

我试图表达一系列简洁的测试:

  1. 如果我为x传递null,它应该抛出
  2. 如果我为y传递null,它应该抛出

为了表达我可以说:

 var fixture = Fixture(); var sut = default( Func); sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonY ) => x => X.Create( anonA, anonB, anonC, x, anonY ) ); Assert.Throws( () => sut( null)); 

对于第二个实例,这只是略有不同,我需要这样做:

 var fixture = Fixture(); var sut = default( Func ); sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonX ) => y => X.Create( anonA, anonB, anonC, anonX, y ) ); Assert.Throws( () => sut( null)); 

对于属性,在AutoFixture中有With 。 方法(和/或ctor)参数是否有等价?

PS 0.我不介意是否有必要为这种情况进入’魔术’字符串 – 即x位为"x"

PS 1.房间里的另一头大象就是我碰到了Get in AutoFixture的4倍重载 – 或者是因为我在这个环境中有旧版本?

PS 2.还可以更好地建议如何对此进行建模 – 只要它们处理的事实是我希望它是一个方法调用而不是属性或字段(我希望它能在AutoFixture样式中工作) )。

AutoFixture中没有任何function可以让这更容易,但我愿意接受建议。 但是,我不知道你怎么能以强烈的方式表达这样的东西。 语法是什么样的?

但是,如果你只需要这个来测试Null Guards的工作,你可以使用AutoFixture.Idioms。

这是一个例子。

 var fixture = new Fixture(); var assertion = new GuardClauseAssertion(fixture); var method = typeof(GuardedMethodHost).GetMethod("ConsumeStringAndInt32AndGuid"); assertion.Verify(method); 

如果你看一下Ploeh.AutoFixture.IdiomsUnitTest.Scenario的源代码,你会发现其他的例子,但我承认它是AutoFixture中记录较差的领域之一……

完全另一件事是,参数很少(或没有参数)的方法比具有许多参数的方法更好,那么您是否考虑过引入参数对象?