5

我正在尝试更改我对 ArcGIS 的单元测试,并开始使用模拟(我使用 rhino)。
当我开始编写测试时,我注意到我必须开始模拟很多对象,并存根很多方法才能通过单个测试。
例如 - 我的控制器首先得到一个RelationshipClass(所以我需要存根IWorkspace和返回IRelationshipClass),然后也得到一个IFeature(A存根),最后调用stubRelClass.GetRelatedObjects(stubFeature), 来返回一个ISetof other IFeatures

为了让它通过而必须存根这么多对象和方法是否正常?我也觉得我真的需要跳过代码(是的 - 我知道我应该先编写测试,我仍在尝试这个),以便找出接下来要存根的内容,以及我应该返回的内容。

我在模拟实现多个接口的 com 类时也遇到了问题。在生产代码中,我在接口之间对它们进行了 QI。如何创建一个在运行时实现两个接口的模拟?

4

3 回答 3

3

根据您的注入链,是的,有时您必须模拟很多对象。但是,如果您要深入多个级别,则可能表明存在设计错误-依赖于 API 的三层数据的对象可能不是松散耦合的。您应该能够通过在某个时候返回某种假对象来将链条扼杀在萌芽状态,该对象具有您正在测试的层所需的必要属性。

您还应该能够在一个[SetUp]方法中进行大部分模拟,然后让每个测试只更改一两件事。

为了模拟多个接口,Rhino 有 MultiMock 的概念。我相信你所追求的语法是:

var mock = 
    MockRepository.DynamicMultiMock<MyType>(
              typeof(Interface1), 
              typeof(Interface2), 
              ....);
于 2009-06-29T06:30:18.580 回答
3

这可能是高耦合的标志——这反过来意味着需要减少依赖关系(这将提高设计和可测试性)。作为粗略的指导方针,一个对象最多应该有 4-6 个协作者。任何超出此范围的事情都会引起我的警觉。

Mocks 是如何使用的?

于 2009-06-29T06:42:25.627 回答
2

对我来说,这听起来像是无法测试的代码,这是一种气味:-(

我建议阅读http://misko.hevery.com/code-reviewers-guide/。作者是教练,负责在测试领域教谷歌开发者。在文章中,他展示了如何编写可测试和不可测试的代码。

进一步推荐阅读:Clean Code (Robert C. Martin) - 主要关注如何编写干净的(对应于可测试的)代码。有效地使用遗留代码 (Michael Feather) - 展示了控制未经测试和不可测试的代码的方法。

于 2009-06-29T06:30:41.933 回答