断言私有方法的例外

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在这种情况下使用的原因.