2 c# nunit assert exception private-methods
我使用NUnit对C#中的私有方法进行单元测试.
例如,我的方法(如果是公共的)应该抛出一个ArgumentNullException.我可以声明该方法抛出ArgumentNullException如此:Assert.Throws<ArgumentNullException>(() => method.Call());
但是,因为我使用反射调用私有方法,所以我会断言一个TargetInvocationException抛出ArgumentNullException类似的方法:Assert.Throws<TargetInvocationException>(() => methodInfo.Invoke(obj, new object[] { params }));
我想声明一个ArgumentNullException而不是一个TargetInvocationException私有方法,所以我可以扫描它的代码,知道它的预期做什么而不是调试找出来.
我如何断言实际的异常,而不是TargetInvocationException?
注意:这个问题并没有解决单元测试公共与私有方法背后的理论.我和我的团队决定对私有方法进行单元测试,这是否是单元测试的方式与这个问题无关.请参阅此问题上最受欢迎的答案,以了解我们的理由.
小智 6
找到我的答案:
var exception = Assert.Throws<TargetInvocationException>(() => methodInfo.Invoke(obj, new object[] { params }));
Assert.IsInstanceOf<Exception>(exception.InnerException);
Run Code Online (Sandbox Code Playgroud)
UPDATE
Assert.IsNotNull(exception.InnerException)让我知道存在一个内部异常.Assert.IsInstanceOf<Exception>(exception.InnerException);将断言任何类型的Exception抛出.我同意两种方式都告诉我们存在内部异常.
但是.....如果我想断言特定类型的内部异常怎么办?
例如,如果我的方法抛出一个ArgumentNullException,那么我不能断言,通过Assert.IsInstanceOf<FileNotFoundException>(exception.InnerException);使用Assert.IsNotNull让我知道内部异常存在,但它不会揭示内部异常的类型.因此,这就是我喜欢IsInstanceOf在这种情况下使用的原因.
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1910 次  |  
        
|   最近记录:  |