Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何测试异常_C#_Unit Testing_Exception Handling - Fatal编程技术网

C# 如何测试异常

C# 如何测试异常,c#,unit-testing,exception-handling,C#,Unit Testing,Exception Handling,我花了一些时间寻找解决问题的方法,但没有成功! 这是我的问题:我有一些代码可以执行以下操作: public void DoSomething(){ try{ DoStuffThatCanThrowException(); }catch(Exception e){ // Do nothing... } } 正如您所看到的,try-catch块吞并了可以在dostuffthatchrowexception()中抛出的所有异常。 我正在努力想一种方

我花了一些时间寻找解决问题的方法,但没有成功! 这是我的问题:我有一些代码可以执行以下操作:

public void DoSomething(){
    try{
       DoStuffThatCanThrowException();
    }catch(Exception e){
       // Do nothing...
    }
}
正如您所看到的,
try-catch
块吞并了可以在
dostuffthatchrowexception()中抛出的所有异常。
我正在努力想一种方法来编写一个单元测试,它基本上可以确保在
dostuffthatchrowexception()
中不会抛出异常。这里的困难在于,我既不能更改
try-catch
块,也不能更改
dostuffthatchanthrowexception()
方法

如有任何提示,我们将不胜感激

编辑
我忘记提到的一个重要细节是,我不能直接调用
dostuffthatchrowexception
,因为它是
内部的
,因此从外部世界看不到它。

你不能从单元测试本身调用dostuffthatchrowexception,因此根本不被try…catch包围吗


编辑:刚刚看到您的方法是内部的。我建议,为了测试的目的,你可以使用一个公开的方法来包装它。这样你可以暂时测试一些东西。一旦您确定方法不会失败,您就不再需要try…catch了。

难道您不能从单元测试本身调用dostuffthatchrowexception,因此根本不需要try…catch吗


编辑:刚刚看到您的方法是内部的。我建议,为了测试的目的,你可以使用一个公开的方法来包装它。这样你可以暂时测试一些东西。一旦你确定这个方法不会失败,你就不再需要尝试了。

对不起,答案太乱了,也许反思会帮助你深入研究

ClassContainingInternalMethod cl = new ClassContainingInternalMethod ();

//any private or internal method you want here.
MethodInfo dynMethod = 
cl.GetType().GetMethod("DoSomeStuff", BindingFlags.NonPublic | BindingFlags.Instance);

dynMethod.Invoke(cl, new object[] {});

很抱歉把答案弄得一团糟,也许反思能帮助你深入研究

ClassContainingInternalMethod cl = new ClassContainingInternalMethod ();

//any private or internal method you want here.
MethodInfo dynMethod = 
cl.GetType().GetMethod("DoSomeStuff", BindingFlags.NonPublic | BindingFlags.Instance);

dynMethod.Invoke(cl, new object[] {});

在try块中,在调用
dostuffthatchRowException()
之后立即添加一个肯定断言。如果发生异常,则不会执行断言。或者,在
catch
块中添加一个否定断言。不确定这是否回答了你的问题;不太清楚。

在try块中调用
dostuffthatchRowexception()
后立即添加一个肯定断言。如果发生异常,则不会执行断言。或者,在
catch
块中添加一个否定断言。不确定这是否回答了你的问题;不太清楚。

你能直接调用
dostuffthatchanthrowexception()
吗?如果不是,则创建包含try-catch块的原始类的子类,并在没有catch块的情况下从那里调用它

class ClassUnderTest extends OriginalClass
{
    @Override
    public void functionToTest()
    {
             DoStuffThatCanThrowException()
    }

}

此外,测试是否存在异常也很困难。您需要找到所有可能抛出的异常,并围绕这些异常进行测试。即使这样,你所说的只是“进行这些测试,没有抛出异常”。这不如说“永远不会抛出异常”,但通常已经足够了。

你能直接调用
dostuffthatchronrowexception()
吗?如果不是,则创建包含try-catch块的原始类的子类,并在没有catch块的情况下从那里调用它

class ClassUnderTest extends OriginalClass
{
    @Override
    public void functionToTest()
    {
             DoStuffThatCanThrowException()
    }

}

此外,测试是否存在异常也很困难。您需要找到所有可能抛出的异常,并围绕这些异常进行测试。即使这样,你所说的只是“进行这些测试,没有抛出异常”。这不如说“永远不会抛出异常”那么有力,但通常已经足够了。

看起来像是一种巨大的代码气味。你有什么理由不能改变方法吗?对于你试图证明不能命中异常的东西进行尝试/捕获似乎是一种愚蠢的逻辑。你能控制任何情况(权限、文件存在、配置等)以确保抛出异常吗?似乎你没有进行单元测试,因为您正在测试一个代码单元,并且根据另一个代码单元的结果来验证您的测试。我将分别测试dostuff that canthrowexception(),然后使用依赖项注入模拟对方法的调用另一个选项是为程序集使用
InternalsVisibleToAttribute
,您可以访问程序集吗定义了
dostuff that canthrowexception
的程序集?看起来像是一个很大的代码气味。你有什么理由不能改变方法吗?对于你试图证明不能命中异常的东西进行尝试/捕获似乎是一种愚蠢的逻辑。你能控制任何情况(权限、文件存在、配置等)以确保抛出异常吗?似乎你没有进行单元测试,因为您正在测试一个代码单元,并且根据另一个代码单元的结果来验证您的测试。我会分别测试dostuff that canthrowexception(),然后使用依赖项注入模拟对该方法的调用。另一种选择是对程序集使用
InternalsVisibleToAttribute
,你能访问中定义了
dostuff that canthrowexception
的程序集吗?他说“这里的困难在于,我既不能更改try-catch块,也不能更改dostuffthatchrowexception()方法。”@CookieMonester这是不可能的,我不能更改这段代码:(+1这是最接近的答案,似乎有机会工作,谢谢他说”这里的困难在于,我既不能更改try-catch块,也不能更改dostuffthatchrowexception()方法。“@cookieMonster这是不可能的,我不能更改这段代码:(+1这是最接近的答案,似乎有机会奏效,谢谢谢谢谢谢你的回答,很遗憾这是不可能的。请参阅我的编辑谢谢你的回答,很遗憾这是不可能的。请参阅我的编辑