我不认为这是目前可能的,或者即使它是一个好主意,但这是我刚才在考虑的事情。我使用 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.Fail
Assert.Inconclusive
return