Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何指定方法只能由单元测试调用?_.net_Unit Testing - Fatal编程技术网

.net 如何指定方法只能由单元测试调用?

.net 如何指定方法只能由单元测试调用?,.net,unit-testing,.net,Unit Testing,如何限制用户调用仅用于单元测试的方法?如果调用不是在单元测试的上下文中进行的,我想抛出一个异常,但是我不知道测试是否有类似于“DEBUG”的符号,用于在DEBUG下构建的项目 我可以使用它的一个例子是DTO及其标识。为了正确地模拟持久化的DTO,我需要为我将要使用的实体分配一个Id。我可以通过添加一个方法或为特定目的添加一个构造函数来实现这一点,但我希望明确的是,为实体分配一个Id只能用于单元测试,而不能在实际代码本身上进行。一般来说,不建议只从单元测试中调用方法。理想情况下,被测代码在单元测试

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


我可以使用它的一个例子是DTO及其标识。为了正确地模拟持久化的DTO,我需要为我将要使用的实体分配一个Id。我可以通过添加一个方法或为特定目的添加一个构造函数来实现这一点,但我希望明确的是,为实体分配一个Id只能用于单元测试,而不能在实际代码本身上进行。

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

即使在这种情况下,“仅测试”方法也应该是一种临时的捷径,而不是长期的解决方案。因此,我不会太担心检测是否从外部单元测试调用该方法。相反,一旦我的代码被测试覆盖,就要努力重构代码,以摆脱“仅测试”方法和其他临时支架,努力实现更干净、更安全的设计

如果你告诉我们你的方法的真正意义,我们可能会给出更具体的建议

关于这个主题的推荐阅读是

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


我想出了另一种解决方案:将实体ID检查提取到一个单独的(虚拟)方法中(可能在单独的接口中),并在单元测试中重写/模拟该方法。通过这种方式,只需几行额外代码就可以消除对仅测试方法的需求。希望这有帮助:-)

如果场景需要,添加
[asembly:InternalsVisibleTo(…)]
属性(指定测试程序集的详细信息)可以允许您的测试代码访问正常的私有方法等;但是,最好尽可能避免这种情况


MSDN

添加了一个场景,我认为它会派上用场。@Jonn,为什么您的代码需要测试一个实体是否具有ID?我将它用作指示该实体是否已持久化到数据库中。如果Id是默认的,那么它还没有被持久化到数据库中。我正在测试一些特定于已持久化到db的实体的案例。@Jonn,这是我通常的假设。但具体地说,根据是否设置了实体ID,您的测试代码有哪些不同之处?您使用什么持久性解决方案(如果有的话)?NHib。目前,它使用一种方法生成细节实体,但一旦实体已被持久化,就不应该可用。这只是一个例子。我发现有很多次需要这样做。我不想为了设置每个实体的Id而存根。