.net - 你如何指定一个方法只能被单元测试调用?

标签 .net unit-testing

如何限制用户调用仅用于单元测试的方法?如果调用不是在单元测试的上下文中进行的,我正在考虑抛出异常,但我不知道对于在调试下构建的项目,测试是否具有诸如“DEBUG”之类的符号。

我可以使用它的一个实例是 DTO 及其身份。为了正确模拟持久化 DTO,我需要为我将使用的实体分配一个 Id。我可以通过为该特定目的添加一个方法或添加一个构造函数来做到这一点,但我想清楚的是,将 Id 分配给实体应该只适用于单元测试,并且永远不应该在实际代码本身上完成。

最佳答案

一般来说,不建议只从单元测试中调用方法。理想情况下,被测代码在单元测试中的行为不应与在现实世界中的行为不同。也就是说,有时这样的技巧是不可避免的,例如在尝试为从未设计为可单元测试的遗留代码编写测试时。

即使在这些情况下,“仅测试”方法也应该是一个临时的捷径,而不是一个长期的解决方案。所以我不会太担心检测是否从外部单元测试调用该方法。相反,一旦我用测试很好地覆盖了代码,就会努力重构它以摆脱“仅测试”方法和其他临时脚手架,努力实现更清洁、更安全的设计。

如果您详细说明您的方法的实际用途,我们或许可以提供更具体的建议。

关于这个主题的推荐阅读是Working Effectively with Legacy Code .

更新

感谢您的解释。我们在遗留项目中的几个地方也有这样的检查,所以我知道有时这是不可避免的。幸运的是,我们还不需要为这些地方编写单元测试(好吧,如果我们的代码中只有这些地方没有单元测试,我会很高兴:-)。

我想到了一个替代解决方案:将实体 ID 检查提取到一个单独的(虚拟)方法中(可能在一个单独的接口(interface)中)并在单元测试中覆盖/模拟它。这样,您只需几行额外的代码就可以消除对仅测试方法的需求。希望这会有所帮助:-)

关于.net - 你如何指定一个方法只能被单元测试调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4907157/

相关文章:

Java Spring ApplicationContext 配置

c# - 为什么Electron杀死带有冒号参数的Windows进程?

c# - 内存传递方法参数的最佳方式

.net - HttpBrowserCapability.Crawler 属性 .NET

reactjs - 单元测试 : Actions must be plain objects. 使用自定义中间件进行异步操作

c# - MSTest VS2010 - DeploymentItem 将文件复制到不同机器上的不同位置

安卓测试 : Target app vs Test app?

c# - 从 C# 中的字符串中删除换行符的最快方法是什么?

c# - 为什么使用只有静态方法的类?

python - 如何在 pytest 中将单元测试和集成测试分开