如何限制用户调用仅用于单元测试的方法?如果调用不是在单元测试的上下文中,我想考虑抛出一个异常,但我不知道测试是否有类似“DEBUG”的符号,用于在调试下构建的项目。
我可以使用它的一个例子是DTO及其身份。要正确模拟持久的DTO,我需要为我将要使用的实体分配一个Id。我可以通过添加方法或为特定目的添加构造函数来做到这一点,但我希望明确指出,将Id分配给实体应仅可用于单元测试,而不应对实际代码本身进行。
答案 0 :(得分:6)
通常,不建议仅使用单元测试调用的方法。理想情况下,被测代码在单元测试中的行为不应与现实世界中的行为不同。也就是说,有时这种技巧是不可避免的,例如,尝试编写遗留代码的测试时,这些代码从未设计为可单元测试的。
即使在这种情况下,“仅测试”方法应该是临时捷径而不是长期解决方案。所以我不会太担心检测是否从外部单元测试中调用该方法。相反,一旦我将代码完全覆盖了测试,就要努力重构它以摆脱“仅测试”方法和其他临时脚手架,努力实现更清洁,更安全的设计。
如果您详细说明您的方法的实际含义,我们可能会提供更具体的建议。
关于这个主题的推荐阅读是Working Effectively with Legacy Code。
感谢您的解释。我们在遗留项目中的几个地方也有这样的检查,所以我知道有时它是不可避免的。幸运的是,我们还不需要为那些地方编写单元测试(好吧,如果没有单元测试我们的代码中唯一的地方,我会非常高兴的: - )。
我想到了一个替代解决方案:将实体ID检查提取到单独的(虚拟)方法(可能在单独的接口中)并在单元测试中覆盖/模拟。这样,只需几行额外代码即可消除对仅测试方法的需求。希望这会有所帮助: - )
答案 1 :(得分:3)
如果场景需要它,添加[asembly:InternalsVisibleTo(...)]
属性(指定测试程序集的详细信息)可以允许您的测试代码通常访问私有方法等;但是,如果可能的话,最好避免这种情况。
MSDN has an example