我正在为一些具有多个 API 版本的软件编写 API 的包装库,并且在多个平台之间同时但单独开发的许多共享调用。随着时间的推移,他们甚至已经合并平台以使用相同的代码库,只是在不同的命名空间和 *.exe 构建下。
我通过编写一个单一的代码库来做到这一点,然后通过构建配置使用预处理器指令和条件编译符号来选择性地使用某些代码进行构建。大约 90% 的代码实际上可以在版本和平台之间重用,所以这很有帮助。在被测项目端一切正常。
但是,我在使用 NUnit 和 NCrunch 对该项目进行单元测试时遇到问题。我创建了相同的构建配置来加载正确的常量并为集成测试项目创建正确的构建文件夹。但是,我注意到两个奇怪的问题:
NUnit 似乎忽略了集成测试项目中的预处理器指令。例如,在下面的示例中,无论配置如何(例如 BUILD_Bar_2015=true),第一行代码总是被命中(BUILD_Foov16=true),即使在 Visual Studio 中看起来所需的行集(对应于当前配置变量) 是唯一一个活跃的:
[TestFixture] public class FooBarIncApplicationTests { #if BUILD_Foov16 public const string path = @"C:\Program Files (x86)\FooBarInc\FooV16\Foo.exe"; #elif BUILD_Foov17 public const string path = @"C:\Program Files (x86)\FooBarInc\FooV17\Foo.exe"; #elif BUILD_Bar_2013 public const string path = @"C:\Program Files (x86)\FooBarInc\Bar 2013\Bar.exe"; #elif BUILD_Bar_2015 public const string path = @"C:\Program Files (x86)\FooBarInc\Bar 2015\Bar.exe"; #endif [Test] public void FooBarIncApplication_Initialize_New_Instance_Defaults() { using (FooBarIncApplication app = new FooBarIncApplication(path)) { ... } } }
此外,似乎当我通过 NCrunch 运行测试时,它只使用与列出的第一个配置创建的构建相对应的 *.dll(例如,它总是测试为 Foo.exe v16 编译的 *.dll。
在我看来,这两个问题是相关的。我想知道 NUnit 和/或 NCrunch 是否无法处理这样的设置,或者是否有一种特殊的方式我应该处理这种独特的设置?
我更大的问题是 #2,即 NCrunch 似乎仅在从第一个配置构建的 *.dll 上运行 NUnit,这使得无法测试任何其他配置。也许这是项目依赖项的问题?(上面示例中的路径是我通过 API 与之交互的程序,而不是我的 *.dll 项目。)