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扩展方法,现在我已经使用它几个星期了,没有问题:下面是如何使它工作的: