我不认为这是目前可能的,或者即使它是一个好主意,但这是我刚才在考虑的事情。我使用 MSTest 对我的 C# 项目进行单元测试。在我的一项测试中,我执行以下操作:
MyClass instance;
try
{
instance = getValue();
}
catch (MyException ex)
{
Assert.Fail("Caught MyException");
}
instance.doStuff(); // Use of unassigned local variable 'instance'
为了使这段代码编译,我必须instance在它的声明或catch块中分配一个值。我也可以return在之后,Assert.Fail但这仍然是一种解决方法,而不是编译器只知道在此之后执行无法继续。 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 知道
如果我在orreturn之后添加,Resharper 会将颜色变为灰色,并显示“代码无法通过启发式访问”的工具提示。Assert.FailAssert.Inconclusivereturn