【问题标题】:List of Mock (Moq) objects - best practices/simplification模拟 (Moq) 对象列表 - 最佳实践/简化
【发布时间】:2009-09-15 21:44:19
【问题描述】:

考虑以下几点:

new SUT(null, null, new List<IObjectBeingMocked>() { mockObjectOne.Object, mockObjectTwo.Object })

我的 SUT(被测系统)需要一个对象列表作为第三个参数。这些需要模拟,因为我对这些设置了一些期望。

我将如何清除它以便我可以消除对列表中每个项目调用.Object 的需要?通常只有两个项目,但这可能会增加,我认为这会使测试更难阅读。

将这个模拟对象列表轻松/良好地转换为实际对象的最佳方法是什么?

【问题讨论】:

    标签: unit-testing mocking moq


    【解决方案1】:

    也许您可以使用扩展方法来管理列表的创建和 Object 属性的调用。

    var list = new List<Mock<Foo>>() { ... };
    new SUT( null, null, list.Select( o => o.Object ).ToList() );
    

    【讨论】:

      【解决方案2】:

      处理这个问题的一个好方法是创建一个 GetSUT() 方法,该方法只在一个地方创建一次。然后,随着您的 SUT 创建发生变化,您只需在一处进行更改。

      【讨论】:

        【解决方案3】:

        您可以使用 Mocks.Query() 方法,该方法将返回所有模拟 SUT 实例的集合。
        此功能存在于 moq 的 beta 版本中。详情见here

        【讨论】:

        • 这是真的,因此我接受了它,但我的最小起订量版本不支持它,因为我没有使用测试版。不过,我会调查一下。
        【解决方案4】:

        为了清楚起见,您可以introduce explaining variables(本地人):

        IObjectBeingMocked objectOne = mockObjectOne.Object;
        IObjectBeingMocked objectTwo = mockObjectTwo.Object;
        
        new SUT(null, null, new List<IObjectBeingMocked>() { objectOne, objectTwo });
        

        编辑:也许用比我的“objectOne”、“objectTwo”更好的名字。 ;)

        【讨论】:

          猜你喜欢
          • 2020-07-19
          • 1970-01-01
          • 1970-01-01
          • 2015-02-17
          • 2018-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多