【发布时间】:2011-01-31 10:51:04
【问题描述】:
我认为这目前是不可能的,或者甚至是一个好主意,但这是我刚才正在考虑的事情。我使用 MSTest 对我的 C# 项目进行单元测试。在我的一项测试中,我执行以下操作:
MyClass instance;
try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}
instance.doStuff(); // Use of unassigned local variable 'instance'
要编译这段代码,我必须在instance 的声明或catch 块中为其赋值。我也可以在Assert.Fail 之后使用return,但这仍然是一种解决方法,而不是编译器只是知道在此之后无法继续执行。据我所知,Assert.Fail 永远不会允许执行越过它,因此instance 永远不会在没有值的情况下使用。那为什么我必须给它赋值呢?如果我将Assert.Fail 更改为throw ex 之类的东西,代码编译得很好,我假设因为它知道异常将不允许执行继续到instance 将被使用未初始化的点。
相反,如果我不想让测试失败,而是被标记为不确定,该怎么办?我可以用Assert.Inconclusive 代替Fail,如果编译器知道在那之后不会继续执行就好了。
那么,关于允许执行在哪里进行,这是运行时与编译时知识的情况吗? C# 以某种方式说成员(在这种情况下为 Assert.Fail)在返回后将永远不允许执行,这是否合理?也许这可能是方法属性的形式。这对编译器有用还是不必要的复杂性?
外部单元测试
由于人们 [有效地] 指出这是编写单元测试的一种愚蠢方式,因此请在单元测试领域之外考虑我的问题:
MyClass instance;
if (badThings)
{
someMethodThatWillNeverReturn();
}
else
{
instance = new MyClass();
}
instance.doStuff();
在这里,我可能会用抛出异常来替换对someMethodThatWillNeverReturn 的调用,也许如果我有事情要做,我可以在异常的构造函数中完成。
Resharper 知道
如果我在Assert.Fail 或Assert.Inconclusive 之后添加return,Resharper 会将return 涂成灰色,并有一个工具提示说“代码是启发式无法访问的。”
【问题讨论】:
-
@SLaks:我想既然是在征求大家的意见,那就是主观的。我很确定我所说的内容目前不受支持,所以我主要是在问它是否是一个有用的功能。那不会有一个客观的答案。
-
@Kobi:呃,积分就是积分;这不是世界末日。如果这个线程产生有用的讨论,那就更重要了(IMO)。 YMMV。 :-P
-
我们不要为了让程序员编写懒惰/糟糕的单元测试而创建额外的语法和函数头的额外属性。
-
@Sky:这就是我将问题标记为社区 wiki 的原因。 :) Jon Skeet 说“是的,这将是合理的”,而您认为这很荒谬。这是一个主观问题!
-
主观:是的。斯基特对这种东西的影响和潜在效用的理解比我的工资等级高几个。只是发表我的主观意见。 p.s.去西方!大声笑
标签: c# compiler-construction runtime execution compile-time