AutoFixture和接口

时间:2012-04-18 11:44:58

标签: c# .net autofixture

假设我有界面:

public interface IFoo
{
    int Bar1 { get; set; }
    int Bar2 { get; set; }
}

如果IFoo上课,我可以写:

fixture.CreateAnonymous<IFoo>();

,结果将为Bar1Bar2设置数字。

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

我正在寻找类似CreateAnonymous的自动化方法。 Currenlty我正在创建界面模拟并明确设置它的属性,这是我想要保存的工作。我必须遗漏一些明显的东西。

1 个答案:

答案 0 :(得分:13)

如果你想要map an interface to a specific concrete class,你当然可以这样做:

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

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

但是,AutoMoq(以及AutoRhinoMocks和AutoFakeItEasy)也是一种选择。有了这个,尝试创建一个IFoo实例将返回一个Moq创建的代理,它实现了IFoo。

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

为了使Moq工作,需要在Mock<T>本身上调用SetupAllProperties()。虽然可能,但在当前的AutoMoq图表中有点难以做到。这已经有work item了,但是如果你仔细阅读讨论,你会发现问题比看起来更复杂。

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