在基于AutoFixture的测试中,我试图尽可能干净地表达以下内容:
当我将<input>
传递给此方法的参数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<Guid, Guid, Guid,string,X>);
sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonY ) =>
x =>
X.Create( anonA, anonB, anonC, x, anonY ) );
Assert.Throws<ArgumentNullException>( () => sut( null));
对于第二个实例,这只是略有不同,我需要这样做:
var fixture = Fixture();
var sut = default( Func<Guid, Guid, Guid,string,X> );
sut = fixture.Get( ( Guid anonA, Guid anonB, Guid anonC, string anonX ) =>
y =>
X.Create( anonA, anonB, anonC, anonX, y ) );
Assert.Throws<ArgumentNullException>( () => sut( null));
对于属性,AutoFixture中有With
。方法(和/或ctor)参数是否有等价?
PS 0.我不介意在这种情况下是否有必要进入“魔术”字符串 - 即x
位为"x"
。
Get
的4倍重载 - 或者是因为我在这个环境中有旧版本?
PS 2.还可以更好地建议如何对此进行建模 - 只要它们处理的事实是我希望它是一个方法调用而不是属性或字段(我希望它可以在一个AutoFixture stylee)。
答案 0 :(得分:3)
AutoFixture中确实没有任何功能可以让这更容易,但我愿意接受建议。但是,我不知道你怎么能以强烈的方式表达这样的东西。语法是什么样的?
但是,如果您只需要这个来测试Null Guards是否有效,那么可以使用AutoFixture.Idioms。
这是一个例子。
var fixture = new Fixture();
var assertion = new GuardClauseAssertion(fixture);
var method = typeof(GuardedMethodHost).GetMethod("ConsumeStringAndInt32AndGuid");
assertion.Verify(method);
如果您查看the source code of Ploeh.AutoFixture.IdiomsUnitTest.Scenario
,您会找到其他示例,但我承认这是AutoFixture中记录较差的区域之一......
完全另一件事是,参数很少(或没有参数)的方法比具有许多参数的方法更好,那么您是否考虑过引入参数对象?