我想知道为什么通用Customize重载返回void并在接受ICustomization实例的非通用重载返回IFixture时似乎改变了灯具?

// you cannot set this var, customize returns void
var configuredFixture = fixture.Customize<whatever>(x => x.OmitAutoProperties());
// this is valid
var configuredFixture = fixture.Customize(new AutoMoqCustomization());


我问是因为我曾考虑过使用流利的样式内联自定义,以进行如下所示的操作,但这当然是无效的。

var localFixture = fixture
    .Customize(new AutoMoqCustomization())
    .Customize<whatever>(x => x.OmitAutoProperties()));

最佳答案

总体答案是:因为我犯了错误

不幸的是,这两种方法并不特别相关,您应该真正将它们视为不同的,并且具有两个不同的名称,例如Foo<T>Bar

当我编写这些函数时,我想不出一个更好的名字。因此,不幸的是,但大多是偶然的相似。

在IIRC中,我在AutoFixture开发的不同阶段创建了这两种方法。航空,Customize<T>首先。

使用AutoFixture后,我意识到使用AutoFixture的正式“模块”或“包装”系统会很好,因此我添加了ICustomizationCustomize方法。

我的最初意图是可以将对Customize的调用链接在一起,所以我添加了Fluent Interface(即返回了IFixture实例)来启用该功能。这样做的目的是为了方便,但事后看来,我认为这是一个错误。该方法的确会改变输入参数,因此设计违反了Command Query Separation

但是,以我的辩护,Fluent接口当时风靡一时...

确实应该将an issue添加到AutoFixture存储库中,以从Customize中删除​​返回值...

关于c# - Autofixure Fixture.Customize-为什么重载具有不同的返回类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48672741/

10-10 03:34