在一个项目中定义预处理器标志并在另一个项目中使用它

Define pre-processor flag in one project and use it in another

我有一个通知服务,负责根据特定标准向各种外部客户发送电子邮件。显然,在 QA 中进行测试时,我们使用预处理器指令将所有通知路由到内部电子邮件。我有一套单元测试来验证将使用哪个电子邮件地址。我遇到的问题是我的单元测试验证条件 foo(例如)是否会向客户端 #1 发送电子邮件。但是,由于我们的预处理器标志,总是失败。

是否可以在一个项目(即单元测试项目)中设置预处理器标志并在另一个项目中使用它?这样我就可以设置一个标志(例如测试)并在我的主项目中检查它。如果设置了 TESTING 标志,则不要将通知路由到本地地址。

不,你可以为C#项目定义的符号可以在两个地方定义:

  1. 在项目配置中
  2. 在 .cs 文件本身中

第一个只会影响为其设置的项目。

此外,这些符号在编译过程中会被使用,根据您放置这些符号的位置,整段代码都会被忽略。因此,当您编译单元测试项目时,该项目引用回被测程序集,该程序集已经编译。

您将不得不为此使用不同的机制。

你考虑过依赖注入吗?向系统注入一个行为,该行为指示 where/how 消息将被路由,您可以在测试期间用模拟或存根替换它以覆盖。

正如 Lasse V. Karlsen 所说,依赖注入是 正确 处理此要求的方法。在你的代码中注入不同的行为肯定比依赖编译器标志等更好

话虽如此,如果目前无法重写应用程序以支持 DI,还有另一个选项可以让您解决此问题:

  1. 创建一个新的 "main application test" 项目
  2. 在此新项目中设置 TESTING 预处理标志
  3. 右键单击该项目并 select "Add existing item"。确保 select "Add as link" 然后 select 主项目中的所有文件。

您现在可以 link 您的单元测试项目到这个新项目。因为文件添加为 links,它们仍然只存在于主项目中,所以在测试版本中也会自动更改 "appear"。不过不要忘记 "Add as link" 任何新文件。