如何从不同解决方案文件中的测试方法访问表单中的方法?

How to access methods in forms from a test method in a different solution file?

我在两个单独的解决方案文件中有两个不同的项目。一个是包含我的单元测试方法的测试项目,另一个是主项目。我知道我需要先创建单个 GUI 表单的实例才能访问其中的方法,但不确定如何执行此操作。

此外,我有某些变量值,只有在我 运行 整个原始应用程序时才会启动。这些值用于主项目中的许多方法。没有它们,我只会得到空值,测试方法就会失败。有没有什么方法可以在不 运行 应用程序的情况下获取这些变量的值?我试图将获取这些变量值的逻辑放在我的测试方法中,然后调用实际方法,但这仍然不起作用。我该如何解决这个问题?

您 运行 遇到的问题在尝试为可测试性方面编写得不好的应用程序编写单元测试时很常见。

通常您编写测试的代码不驻留在表单或 UI classes 中。 业务逻辑应位于主项目中的单独 classes 中。然后可以从您的 UI 和您的单元测试中调用业务逻辑。

因此您必须首先将任何业务逻辑移动到分隔 classes。

接下来您需要做的是删除新创建的 classes 对其他 classes 的所有依赖关系,这些依赖关系会阻止您编写单元测试并将这些依赖关系替换为接口。

例如,您可以更改您的应用程序,以便您在问题中提到的每个环境变量都由特殊的 classes 检索。 如果您为此 classes 创建接口,您可以在单元测试中设置所谓的 Mock(真实 class 的伪造版本),您可以在测试中将其配置为特定测试场景所需。


一些一般性建议:

  • 重构要测试的代码(即使其更易于测试)通常比编写单元测试本身花费更多的时间。有整本关于重构所谓 "legacy" 代码的书。

  • 重构应用程序以实现可测试性通常意味着解耦具体 classes 之间的依赖关系并改用接口。在生产代码中,您将生产 class 传递给接口,在单元测试中,您可以创建一个 "mock" class 实现相同的接口,但其行为方式与测试中所需的方式相同

  • 编写单元测试时,您可能会考虑使用像 Moq 这样的模拟框架。它将为您节省大量时间并使测试代码更小。你会在这里找到介绍:Unit Testing .NET Application with Moq Framework

  • 理想情况下,您应该从一开始就以可测试性的方式设计您的应用程序。 "TDD" (test driven development) 方法甚至更进一步,在这里你在编写实际代码之前编写测试,但根据我的经验,这种方法并不经常使用。