带有匿名值的广义Func包装等效于AutoFixture’With’
在基于AutoFixture的测试中,我试图尽可能干净地表达以下内容:
当我将传递给此方法的参数
x
时,匿名填写其他参数,结果是……
以工厂方法为例: –
class X { public static X Create( Guid a, Guid b, Guid c, String x, String y);
我试图表达一系列简洁的测试:
- 如果我为
x
传递null,它应该抛出 - 如果我为
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中记录较差的领域之一……
完全另一件事是,参数很少(或没有参数)的方法比具有许多参数的方法更好,那么您是否考虑过引入参数对象?