如何使用模拟对ArcObjects进行单元测试?


10

我非常喜欢单元测试,但是在使用ArcObjects框架时,仍然使用FGDB来获取用于运行单元测试的功能。

是否有人成功对IFeature,IGeometry,IWorkspace等思想进行了嘲弄。我并不真正在乎您使用什么模拟框架,只是看到您的工作方式将不胜感激。

我看到的问题是,您必须在同一个对象上的多个接口之间进行切片和切块,因此创建代表性的模拟对象的开销非常大。


对于其他可能不了解Mocking的人(例如我),请参见此链接。有趣的东西。stackoverflow.com/questions/300177/...
西蒙

Answers:


14

在一个大型项目中,我们已经很好地将ArcObjects代码与业务逻辑隔离开来。我会说,通常这是要走的路,而不是尝试全部模拟,即使有可能使用模拟框架来获得某种方式。

问问自己,为什么你觉得有必要嘲笑。通常,这是由于缺少抽象。考虑小的责任,并最小化巨大的丑陋ArcObject怪兽的表面。避免仅仅因为某些地方需要某些方面而拖拉ArcObject类型。

我可以从我们的项目中举一个具体的例子。该代码的一部分似乎依赖于IMxDocument。事实证明,唯一的原因是需要刷新活动视图。因此,我们改为创建了一个IViewRefresher接口,并且仅在该接口上工作;易于模拟和测试。此外,它使代码的意图更加清晰,并消除了人们开始使用IMxDocument做有趣的事情的诱惑,因为他们不想做的事情是因为我们要做的只是刷新。使用许多ArcObjects代码可以完成相同的练习。

同样,我们将对要素类的所有访问都包装在类型安全的包装器中,再次提供了可屏蔽的代码,以保护业务代码免受ArcObjects的侵害。

我们甚至没有讨论过使用ArcObjects的几何类型,但是目前我们确实允许在我们的代码中直接使用这些接口。(但是,仅允许使用界面知识,并且所有几何实例都使用我们自己的几何工厂。)

总而言之,我并不是不鼓励进行模拟,但我鼓励在与ArcObjects不同的抽象级别进行模拟。


很好的答案。我还对单元测试AO代码进行了很多细化。您提供的示例很棒(IViewRefresher),在这里我可以将其应用于我的工作。您能举些例子吗?
乔治席尔瓦

感谢Cumbayah。这是我目前在大中型项目上所做的工作,创建了一个单独的程序集来抽象所有AO实现。我想测试的是这种抽象,而不求助于存储的数据,无论是XML工作空间还是某种类型的地理数据库。我发现不时使用不同的数据会产生新的问题,然后需要为其创建测试,这需要附加的测试数据。随着时间的流逝,我对于所有测试用例都有如此之多的测试数据,以至于这些项目变得越来越难以管理和移动,并由我的自动构建服务器进行下载。
BlinkyBill 2010年

Cumbayah,这听起来令人难以置信。我想举一些例子。您是否考虑过在一次ESRI会议上就此主题发表一些演讲?我认为ESRI / GIS社区正在为这种事情而死。希望看到一些开源运动开始用于测试/模拟ArcObjects。
Keith G 2010年

我知道这是一个古老的话题,但是我们有机会获得您“自己的几何工厂”的样本吗?我试图让我的组织朝着单元测试的方向发展,但是我却迷上了ArcObjects猴子。
路加福音

4

Dave Bouwman和Brian Noyle 为Esri开发人员进行的单元测试是一个很好的起点-尤其是因为他们抛出了一些代码来查看。


感谢指针bwreilly。Dave所做的只是使用要素的XML表示。因此,尽管有帮助,但仍然依靠存储数据进行测试,这就是我试图摆脱的问题。
BlinkyBill
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.