Checking if argument is thrown in unit-tests
我正在为一个应用程序进行单元测试,该应用程序有一个构造函数,它将三个值作为参数。 数字应为0或更高,现在我正在编写一个单元测试,用于抛出异常的构造函数,如果不是这样的话。
我无法弄清楚的是我如何在"断言"之后写什么来确定这一点,以便在非法数字传递给构造函数时测试通过。 提前致谢。
编辑:我正在使用MSTest框架
1 2 3 4 5 6 7 8 9 10 11 12 | public void uniqueSidesTest2() { try { Triangle_Accessor target = new Triangle_Accessor(0, 10, 10); } catch (){ Assert // true (pass the test) return; } Assert. // false (test fails) } |
//从代码中......
1 2 3 4 5 6 |
首先,你应该抛出
其次,你的单元测试应该期望抛出异常,如下所示:
1 2 3 4 5 | [ExpectedException(typeof(ArgumentOutOfRangeException))] public static void MyUnitTestForArgumentA() { ... } |
因此,您需要创建单独的单元测试 - 每个参数一个 - 测试当参数超出范围时方法是否抛出正确的异常。
无需使用try catch块。使用NUnit或MSTest框架,您可以在测试方法声明中使用属性来指定您期望的异常。
MSTest的
1 2 3 |
如果您没有nunit(或其他内置此支持的框架,则可以使用以下类型的帮助程序方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public static void ThrowsExceptionOfType< T >(Action action) where T: Exception { try { action(); } catch (T) { return; } catch (Exception exp) { throw new Exception(string.Format("Assert failed. Expecting exception of type {0} but got {1}.", typeof(T).Name, exp.GetType().Name)); } throw new Exception(string.Format("Assert failed. Expecting exception of type {0} but no exception was thrown.", typeof(T).Name)); } |
你的测试看起来像这样
1 2 3 4 5 | AssertHelper.ThrowsExceptionOfType<ArgumentException>( () => { new Triangle_Accessor(0, 10, 10); }); |
它可能不是最好的解决方案,但如果我正在测试以确保抛出异常,我将执行以下操作:
1 2 3 4 5 6 7 8 9 10 | public void uniqueSidesTest2() { try { Triangle_Accessor target = new Triangle_Accessor(0, 10, 10); Assert.Fail("An exception was not thrown for an invalid argument."); } catch (ArgumentException ex){ //Do nothing, test passes if Assert.Fail() was not called } } |
因为构造函数调用应该抛出一个错误,如果它到达第二行(Assert.Fail()行),那么你知道它没有正确抛出异常。
你没有提到你用于单元测试的框架,但我认为你所寻找的是类似于这里显示的内容:
http://www.nunit.org/index.php?p=exception&r=2.4
您不需要在
总是失败,有一个Assert.Fail。