假设我有界面:
public interface IFoo
{
int Bar1 { get; set; }
int Bar2 { get; set; }
}
如果IFoo
上课,我可以写:
fixture.CreateAnonymous<IFoo>();
,结果将为Bar1
和Bar2
设置数字。
但是如何用界面做到这一点?我尝试使用AutoMoqCustomization
,但这似乎是针对具有接口类型的属性而不是接口本身。
我正在寻找类似CreateAnonymous
的自动化方法。 Currenlty我正在创建界面模拟并明确设置它的属性,这是我想要保存的工作。我必须遗漏一些明显的东西。
答案 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了,但是如果你仔细阅读讨论,你会发现问题比看起来更复杂。
在任何情况下,由于许多其他原因,具有属性的接口也是一个坏主意,所以最好的解决方案是重新设计接口,使其没有属性。