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

时间:2015-06-01 13:08:29

标签: c# unit-testing nunit

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. 在项目配置中
  2. 在.cs文件中
  3. 第一个只会影响设置它的项目。

    此外,在编译期间使用这些符号,根据放置这些符号的位置,简单地忽略整个代码段。因此,当您编译单元测试项目时,该项目具有对测试中的程序集的引用,该程序集已经被编译。

    你将不得不使用不同的机制。

    您是否考虑过依赖注入?向系统注入一个行为,指示消息在何处/如何路由,在测试期间可以替换为模拟或存根以覆盖。

答案 1 :(得分:1)

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

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

  1. 创建一个新的"主要应用程序测试"项目
  2. 在此新项目中设置TESTING pre-processoe标志
  3. 右键单击项目,然后选择"添加现有项目"。确保您选择"添加为链接"然后选择主项目中的所有文件。
  4. 您现在可以将您的单元测试项目链接到这个新项目。由于文件是作为链接添加的,因此它们仍然只存在于主项目中,因此会自动更改"出现"在测试版中也是如此。不要忘记"添加链接"但是,任何新文件。