3

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

当我传给这个方法的<input>参数x,匿名填写其他参数,结果是……

以工厂方法为例:-

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

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

  1. 如果我通过 null for x,它应该抛出
  2. 如果我通过 null for y,它应该抛出

为了表达我可以说:

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));

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

PS 0. 我不介意在这种情况下是否有必要进入“魔术”字符串 - 即,有x一点 be "x"

PS 1. 房间里的另一头大象是我的头撞到了GetAutoFixture 中的 4 倍过载 - 或者是因为我在这个环境中有一个旧版本?

PS 2.也愿意接受关于如何建模的更好建议 - 只要他们处理我希望它是方法调用而不是属性或字段的事实(并且我希望它在 AutoFixture 样式中工作)。

4

1 回答 1

3

AutoFixture 中确实没有任何功能可以让这更容易,但我愿意接受建议。但是,我不明白您如何以强类型的方式表达类似的东西。语法会是什么样子?

但是,如果您只需要它来测试 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 文档记录较少的领域之一......

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

于 2012-07-12T15:45:16.423 回答