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

时间:2013-12-26 16:28:57

标签: c# unit-testing moq

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

我想对这些类进行单元测试(没有接口)。

我遇到了这两种选择:

  1. 私人访问者
  2. PrivateObject
  3. 但它们是否会提供我可以通过接口获得的所有单元测试功能?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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