17

假设我有接口:

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

如果IFoo是上课,我可以写:

fixture.CreateAnonymous<IFoo>();

结果将为 和 设置Bar1数字Bar2

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

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

4

1 回答 1

16

如果您想将接口映射到特定的具体类,您当然可以这样做:

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 图中有点难以做到。已经有一个工作项,但是如果您通读讨论,您会发现这个问题比看起来更复杂。

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

于 2012-04-18T12:17:37.587 回答