【问题标题】:Integration testing private classes and methods集成测试私有类和方法
【发布时间】:2010-02-08 22:38:33
【问题描述】:

对于单元测试,您不应该测试私有方法,是的,但是对于集成测试(使用 MSTest 或 NUnit 之类的单元测试框架),我非常希望针对测试 url 运行内部 API 调用,以确保当前代码在第三方 API 供应商更改其后端时有效。

鉴于系统的复杂性(愚蠢的 API 有数百个参数),我将其中的大部分隐藏在接口和 IoC 后面,API 帮助程序类完全位于我们的数据层库内部。我不想更改它,因为它曾经是公开的,我们发现奇怪的开发人员是该项目的新手并且通常没有经验,他们会立即继续并直接从网站代码调用 api。使类内部化应该确保他们至少在破坏我们抽象层的点之前进行思考。

我一直在构建大量反射代码来获取内部方法,但它运行得不太好,而且越来越多。有没有办法让某些库的方法公开可见?有没有办法让测试库将自己视为包含 api 的库的一部分?这是最佳实践吗?

【问题讨论】:

  • 根据您使用的语言,您可以设置库类的可见性并从中派生一些测试。假设您使用的是受保护的。
  • 根据您提到的 NUnit 和 MSTest,我在回答中假设您使用的是基于 .net 的语言,如果不正确,请告诉我们=)
  • .NET C# 混合了 3.5(用于测试)和 2.0(用于层代码),后者归功于 stage/uat/prod 服务器的延迟升级。

标签: unit-testing mstest integration-testing


【解决方案1】:

InternalsVisibleTo attribute 在这里是你的朋友 =) 如果你把它放在 AssemblyInfo.cs 中(至少我通常把它放在那里)并指定你希望在内部公开的测试/其他程序集的名称方法,然后它们就可用了。额外的好处(至少在我看来)是 Visual Studio 的智能感知系统/编译器知道该属性及其用途,您将为内部方法提供完整的智能感知。

与反射不同,只要您更改内部方法签名,它就不会在不提供编译时错误的情况下严重崩溃。

【讨论】:

  • 谢谢,这很有魅力。只要我谨慎使用它,它就非常符合我的代码良心。唯一不愉快的是我的程序集都已签名,这需要我的测试程序集也被签名才能使用上述属性。
猜你喜欢
  • 2020-08-03
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多