使用MOQ对没有接口的类进行单元测试

use*_*r14 5 c# unit-testing moq

嗨,我是MOQ Testing的新手.我有很多没有接口或抽象方法的类.其中一个也使用一些System Interop库.他们也有很少的私人成员,可以在方法中访问.

我想单元测试这些类(没有接口).

我遇到了这两种选择:

  1. 私人访问者
  2. PrivateObject

但是他们会提供我可以通过接口获得的所有单元测试功能吗?

Hol*_*roe 0

微软很久以前就废弃了私有访问器。私有访问器生成器存在缺陷,如果您使用访问器生成器未正确支持的某些语言构造,则可能会使 Visual Studio 崩溃或拒绝构建。

首先,测试私有方法也是一个糟糕的主意。您想要从外部测试一个类,以便您向该类添加任何内容都会使其产生预期的结果。该类如何执行您希望它执行的操作是实现细节。如果您开始为私有方法编写单元测试,那么您正在创建一个依赖项,这可能会使更改实现细节变得更加困难。这违背了私有方法的目的之一,即只要外部行为不变,就允许类随意更改内部。

我的建议是避免私有测试,而是重构您的类以使公共方法更易于测试。通常,这涉及到一个练习,您将具有怪物方法的怪物类拆分为具有简单接口的简单类的细粒度类设计。

关于这个主题有一本很棒的书:Michael Feathers 的《有效处理遗留代码》。他将遗留代码定义为没有很好地覆盖测试的代码,我相信这与您的代码相匹配,并描述了许多使代码更具可测试性的具体技术。

Moq 是一个测试工具,如果您的类依赖项是通过接口或抽象类实现的,那么它就很有意义。这里最小起订量可用于测试您的类是否以预期的方式与某些接口交互。使用起订量而不是具体实现的好处是,您可以将测试集中在一个类上,并消除依赖类中的意外副作用,并且在许多情况下简化测试设置。这意味着 Moq 非常适合测试一个类如何与其他类交互,这通常是最有趣的测试。