假设我有界面:

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

如果IFoo是类,我可以这样写:
fixture.CreateAnonymous<IFoo>();

结果将为Bar1Bar2设置数字。

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

我正在寻找像CreateAnonymous这样的自动化类。 Currenlty我正在创建接口(interface)模拟并显式设置它的属性,这是我要保存的工作。我必须错过一些显而易见的东西。

最佳答案

如果您想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,但是如果您仔细阅读讨论,您会发现问题比看起来的要复杂。

无论如何,由于许多其他原因,具有属性的接口(interface)也是一个坏主意,因此最好的解决方案是重新设计接口(interface),使其不具有属性。

关于c# - 自动修复和界面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10208648/

10-17 02:46