AutoFixture和接口

19

假设我有以下接口:

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

如果IFoo是一个类,我可以这样写:

fixture.CreateAnonymous<IFoo>();

结果将为 Bar1Bar2 设置数字。

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

我正在寻找像CreateAnonymous用于类一样的自动化方法。目前,我正在创建接口模拟并明确设置其属性,而我想要节省这种工作。我肯定漏掉了一些明显的东西。


2
这是如何实现的:http://blog.ploeh.dk/2013/04/08/how-to-automatically-populate-properties-with-automoq - Mark Seemann
1个回答

18
如果你想要将一个接口映射到一个具体的类,你当然可以这样做:
fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>());

(或者使用fixture.Register<IFoo>( fixture.CreateAnonymous<ConcreteFoo>)缩写方式)

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

然而,使用Moq你看不到Bar1和Bar2的内容。这不仅因为AutoFixture不会调用setter,还因为Moq默认情况下不会实现getter。

为了使Moq工作,需要在Mock<T>上调用SetupAllProperties()。虽然可能,但在当前的AutoMoq图中这有点困难。已经有一个工作项来解决这个问题,但如果你阅读讨论,你会发现这个问题比它看起来的要复杂得多。

无论如何,带属性的接口出于许多其他原因都是一个糟糕的想法,所以最好的解决方案是重新设计接口,使其不具有属性。


4
“使用带有属性的接口是一个不好的想法” - 总是吗?如果是,你能给我一个链接吗? :) - Pol
2
很多原因。其中之一是Demeter法则:http://en.wikipedia.org/wiki/Law_of_Demeter让我反问一下:具有属性的接口提供了什么好处? - Mark Seemann
2
具体类型的公共API同样可以告诉你这一点。 - Mark Seemann
3
总的来说,我非常赞同,我完全支持编写干净的代码,但我的原因有点主观。无论如何,我已经创建了CreateAnonymousMock扩展方法,并且使用了几周,没有问题:http://pol84.tumblr.com/post/23032897078/autofixture-and-interfaces - Pol
这正是我正在寻找的 - 除了Ploeh在https://github.com/AutoFixture/AutoFixture/issues/61中破坏了它。 我想我还得继续寻找 :) - increddibelly
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接