我想知道为什么通用 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 使用正式的“模块”或“包”系统会很好,所以我添加了 ICustomization
, 和 Customize
方法。
我的初衷是可以将对 Customize
的调用链接在一起,所以我添加了 Fluent Interface (即返回 IFixture
实例)以启用它。目的是为了方便,但事后看来,我认为这是一个错误。该方法确实改变了输入参数,因此设计违反了Command Query Separation .
不过,在我看来,Fluent Interfaces 在当时风靡一时......
确实应该添加 an issue到 AutoFixture 存储库以从 Customize
中删除返回值...
关于c# - Autofixture Fixture.Customize - 为什么重载有不同的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672741/