【发布时间】:2010-11-06 22:57:29
【问题描述】:
我为单元测试编写了一个抽象基类,它为我们的测试运行设置了足够的环境。该类将一些运行时环境位公开为属性,其类型因测试而异(属性类型是在继承的具体测试类中指定的类型参数)。
这一切都很好,除了一位同事注意到他无法在调试器中查看任何类的属性。原来原因是他的继承类中没有定义字段,并且 CLR 优化了某些东西或其他东西,所以调试器无法显示属性。是否有可能在基类中以某种方式防止这种情况,还是我必须诉诸于告诉所有人他们需要定义至少一个在测试期间某处使用的字段?
编辑:
听起来可能的罪魁祸首应该是优化/调试设置。也就是说,我在调试模式下从 Visual Studio 构建应用程序,我已经仔细检查了所有项目是否都设置为调试构建,并且此解决方案中的所有项目都没有设置优化标志。
也许还需要注意我正在使用 MSTest 和 Visual Studio 测试运行程序。
编辑 2:
当我在 Quickwatch 中评估属性并获得红色感叹号和文本“无法评估表达式”错误文本时,我指的是“无法查看属性”。为了避免你认为我的怀疑完全偏离了基础,添加一个在测试初始化方法中初始化的实例字段会使问题消失......
编辑 3:
检查了构建输出。我注意到编译器是使用这些选项调用的:
/debug+
/debug:full
/optimize-
/define:DEBUG,TRACE
我应该认为这足以阻止这种情况发生,但是你去吧。 :)
【问题讨论】:
-
如果您进行调试构建会发生什么?
-
嗯...这听起来很奇怪。您能否提供一个简短但完整的测试程序来演示它?
-
@John Saunders:正是我所描述的。
-
@Rytmis:这就是我认为您正在查看发布版本的原因。否则有人在调试构建期间将其设置为优化。 C# 在任何情况下都不会做太多优化。在调试版本中优化某些东西似乎不太可能 - 因此我怀疑您没有在查看调试版本。
-
好吧,我会被诅咒的。我能想到的最简单的测试用例没有表现出这种行为。 :(
标签: c# .net optimization clr debugging