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

时间:2012-07-12 13:08:40

标签: c# unit-testing mocking autofixture

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

当我将<input>传递给此方法的参数x时,匿名填写其他参数,结果为......

以工厂方法为例: -

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

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

  1. 如果我为x传递null,则应抛出
  2. 如果我为y传递null,则应抛出
  3. 为了表达我可以说:

    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"

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

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

1 个答案:

答案 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中记录较差的区域之一......

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