C# 自动夹具和接口

C# 自动夹具和接口,c#,.net,autofixture,C#,.net,Autofixture,假设我有一个接口: public interface IFoo { int Bar1 { get; set; } int Bar2 { get; set; } } 如果IFoo是类,我可以写: fixture.CreateAnonymous<IFoo>(); fixture.CreateAnonymous(); 结果将为Bar1和Bar2设置数字 但如何使用接口实现这一点呢?我尝试使用AutoMoqCustomization,但这似乎是针对具有接口类型的属性,而

假设我有一个接口:

public interface IFoo
{
    int Bar1 { get; set; }
    int Bar2 { get; set; }
}
如果
IFoo
是类,我可以写:

fixture.CreateAnonymous<IFoo>();
fixture.CreateAnonymous();
结果将为
Bar1
Bar2
设置数字

但如何使用接口实现这一点呢?我尝试使用
AutoMoqCustomization
,但这似乎是针对具有接口类型的属性,而不是接口本身

我正在寻找像
CreateAnonymous
这样的自动化方法是用于类的。目前,我正在创建接口模拟并显式设置其属性,这是我想保存的工作。我肯定错过了一些明显的东西。

如果你愿意,你当然可以这样做:

fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>());
fixture.Register(()=>fixture.CreateAnonymous());
(或
fixture.Register(fixture.CreateAnonymous)
简称)

但是,AutoMoq(以及AutoHinoMocks和AutoFakeitesy)也是一种选择。这样,尝试创建IFoo实例将返回一个Moq创建的代理,该代理实现IFoo

但是,使用Moq,您不会看到Bar1和Bar2被填充。这不仅是因为AutoFixture不调用setter,而且因为Moq(默认情况下)不实现getter

为了使Moq工作,需要调用
Mock
本身上的SetupAllProperties()。虽然有可能,但在当前的自动烟雾图中,这有点困难。对此已经有了一个明确的解释,但是如果你仔细阅读讨论,你会发现这个问题比看起来更复杂


在任何情况下,具有属性的接口也是一个坏主意,因为还有许多其他原因,所以最好的解决方案是重新设计接口,使其不具有属性。

“具有属性的接口是个坏主意”-总是吗?如果有,你能给我一个链接吗?:)原因很多。德米特定律就是其中之一:作为回报,我要问一个问题:与房产的接口有什么好处?我熟悉德米特定律。我对实体使用属性(在90%的情况下是只读的),但只对某些数据子集使用属性,这只是因为Demeter定律并不适用于所有数据。尽管如此,有时它们还是有用的。具体类型的公共API也会告诉你这一点。总的来说,我非常同意,我完全支持干净的代码本身,但我的理由有点主观。无论如何,我已经创建了CreateAnonymousMock扩展方法,现在我已经使用它几个星期了,没有问题:下面是如何使它工作的: