我有一个通知服务,负责根据特定条件向各种外部客户发送电子邮件。显然,我们在QA中测试时使用预处理器指令将所有通知路由到内部电子邮件。我有一套单元测试来验证将使用哪个电子邮件地址。我遇到的问题是我的单元测试验证标准foo(例如)是否会向客户端#1发送电子邮件。但是,由于我们的预处理器标志,总是失败。
是否可以在一个项目(即单元测试项目)中设置预处理器标志并在另一个项目中使用它?这样我就可以设置一个标志(例如TESTING)并在我的主项目中检查它。如果设置了TESTING标志,则不要将通知路由到本地地址。
答案 0 :(得分:2)
不,您可以在两个地方定义可以为C#项目定义的符号:
第一个只会影响设置它的项目。
此外,在编译期间使用这些符号,根据放置这些符号的位置,简单地忽略整个代码段。因此,当您编译单元测试项目时,该项目具有对测试中的程序集的引用,该程序集已经被编译。
你将不得不使用不同的机制。
您是否考虑过依赖注入?向系统注入一个行为,指示消息在何处/如何路由,在测试期间可以替换为模拟或存根以覆盖。
答案 1 :(得分:1)
正如Lasse V. Karlsen所说,依赖注入是处理这一要求的正确的方式。在代码中注入不同的行为肯定会更好,而不是依赖编译器标志等。
话虽如此,如果重写应用程序以支持DI目前不是一个选项,还有另一个选项可以让你解决这个问题:
TESTING
pre-processoe标志您现在可以将您的单元测试项目链接到这个新项目。由于文件是作为链接添加的,因此它们仍然只存在于主项目中,因此会自动更改"出现"在测试版中也是如此。不要忘记"添加链接"但是,任何新文件。