c# - Autofixture Fixture.Customize - 为什么重载有不同的返回类型?

标签 c# autofixture

我想知道为什么通用 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/

相关文章:

c# - 为什么 Microsoft Visual Studio 2013 在加载非常大的 C++ 和 C# 解决方案时会意外重启?

c# - 如何在log4net配置文件中动态设置保存路径

c# - 模拟调用异常为 0 次,但我可以正确看到执行的调用

c# - 具有 NSubstitute 的 AutoFixture 是否可能/支持从代理接口(interface)返回自动值

unit-testing - 如何在 AutoFixture 中创建样本生成器以始终返回与 Regex 匹配的字符串?

c# - 仅当子元素具有特定数量的元素时才选择父元素

c# - 发送电子邮件而不在“已发送”文件夹中留下副本

c# - 派生类中引入的公共(public)接口(interface)

c# - 覆盖 Autofixture 自定义设置

c# - 防止 Autofixture 填充子集合