如何指定只能通过单元测试调用方法?

Jon*_*onn 2 .net unit-testing

如何限制用户调用仅用于单元测试的方法?如果调用不是在单元测试的上下文中,我想考虑抛出一个异常,但我不知道测试是否有类似"DEBUG"的符号用于在调试下构建的项目.

我可以使用它的一个例子是DTO及其身份.要正确模拟持久的DTO,我需要为我将要使用的实体分配一个Id.我可以通过添加方法或为特定目的添加构造函数来做到这一点,但我希望明确指出,为实体分配Id应仅可用于单元测试,而不应该在实际代码本身上完成.

Pét*_*rök 6

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

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

如果您更多地了解您的方法的实际含义,我们可能会提供更具体的建议.

关于该主题的推荐阅读材料是与遗留代码有效合作.

更新

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

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