【问题标题】:Generalised Func wrapping with Anonymous Values equivalent to AutoFixture 'With'具有等效于 AutoFixture 'With' 的匿名值的广义 Func 包装
【发布时间】:2012-07-13 16:40:58
【问题描述】:

在基于 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,它应该抛出

为了表达我可以说:

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 样式)。

【问题讨论】:

    标签: c# unit-testing mocking autofixture


    【解决方案1】:

    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 记录较少的领域之一...

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

    【讨论】:

    • +1 谢谢。你建议的成语几乎钉住了我所追求的东西。以前花了一些时间仔细阅读 Idioms 的东西——比如 AF,一旦你开始学习 molehill,这一切都很明显,所以当我有一个模糊的想法时,我没有把这些点联系起来,只是知道我需要让@ploeh 关注这个问题。您对 Introduce Parameter Object 的相关性有所了解,当然还有其他情况下限制会强制解决您想要的问题。然而,现在的我会主张 6-8 作为分界线超过 4
    • 即具有高达 16 的重载将是一个坏信号。另一个问题是,这是一个循环论点——我会回到原点,必须将保护子句中的 TDD 放入我的 PO 类/结构中。
    • 经过反思,我想如果我在链中使用显式 ICustomization 进行构建,它会拦截名为 x 的顶级参数的样本创建,返回给定值/Func结果。然后我所需要的就是在 C# 强迫我手写.FromFactory&lt;Guid, Guid, Guid, String, String)&gt;( X.Create) 时捏住我的鼻子。 ......那么在那个空间里有什么我应该注意的吗? 罢工>。哦,这都是正交的; Register...FromFactory 是您引入工厂方法的方式,而 Idiom 是您锻炼守卫的方式 - 无需组合。
    • 这让我希望FromFactory(可能还有其他一些相关方法)上的最大重载类型参数计数达到 8,因为我希望能够注册一个工厂方法是边界线(在他们将参数引入清洁之前)。作为 issuepull 请求是否有意义,或者您是否认为核心应该保持固执己见,并让人们在其他地方维护更多参数重载作为扩展方法。在此期间,再次感谢您在此评论挥霍期间的 teddybearing。
    • FromFactory 限制为 4 个输入参数有几个原因。最初的原因是 AutoFixture 仍然是在 .NET 3.5 上编译的,所以具有 4 个参数的 Func 是最大的预定义委托。虽然我可以创建自定义委托,但我确实发现它是一个非常合适的限制。正如 Bob 大叔在 Clean Code 中所写,一个参数很好,但零更好。从这个角度来看,4 已经太多了,所以我认为没有理由支持更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    相关资源
    最近更新 更多