c# - 测试依赖于企业库的代码,即使它不提供接口(interface)?

标签 c# unit-testing dependency-injection enterprise-library

也许我表现出对依赖注入(inject)和测试缺乏了解,但我不明白对未实现接口(interface)的类使用依赖注入(inject)如何帮助我进行测试?

例如,在 Enterprise Library 5.0 文档中,它讨论了使用 Unity 容器创建实例。它说这有助于“可测试性:在使用依赖注入(inject)样式时将类与依赖项隔离是微不足道的。” MSDN

如何在我的单元测试装置中使用它?他们的例子有一个构造函数,其参数作为类而不是接口(interface):

public class TaxCalculator 
{
  private ExceptionManager _exceptionManager;
  private LogWriter _logWriter;

  public TaxCalculator(ExceptionManager em, LogWriter lw) 
  {
    this._exceptionManager = em;
    this._logWriter = lw;
  }
}

最佳答案

要回答“我如何测试企业库代码”这个问题:您不需要。测试别人的东西是其他人的工作。 Enterprise Library 或任何其他第 3 方库中的任何接口(interface)或抽象都是为了它们自己的抽象目的而存在,而不是为了您的目的。

您需要做的是定义您自己的接口(interface)来描述您的应用程序的需求(日志记录、缓存、加密等),然后使用企业库(或其他第 3 方库)编写实现您的接口(interface)的适配器。这种做法被称为 Dependency Inversion Principle .

要测试您自己以这种方式设计的代码,对于单元/组件级别的测试,您只需对您自己定义的那些接口(interface)(例如 IMyOwnLogger)使用测试替身。要测试您为适应 3rd 方库而编写的适配器,您需要编写集成测试。要测试它们是否协同工作,您需要编写验收测试,通过 UI 或皮下方式驱动应用。

有关此 View 的更多信息,请查看我的文章:“TDD Best Practices: Don't Mock Others”。

关于c# - 测试依赖于企业库的代码,即使它不提供接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9979481/

相关文章:

c# - 在单元测试中设置 HttpContext.Current.Session

c# - 如何编写使用 return 关键字的单元测试用例?

dependency-injection - Ninject 缓存注入(inject)的 DataContext?生命周期管理?

c# - 在c#中将点移动到另一个

c# - 当 T 为 IEnumerable<U> 时,myClass<T> 的隐式转换失败

c# - 如何暂停 DataTable 通知或数据绑定(bind)以防止 UI 更新

javascript - 使用 ScrewUnit 模拟 javascript 方法

javascript - 无法在 Restangular 配置函数中传递依赖项 (AngularJs)

dependency-injection - 如何设置 Ninject DI 以创建 Hyprlinkr RouteLinker 实例

c# - 什么是 ASP.NET 成员资格替代方案