确保测试中的方法抛出了预期的异常,而不是测试用例的任何其他部分

时间:2016-06-28 12:47:03

标签: c# unit-testing vs-unit-testing-framework expected-exception

我正在使用Visual Studio单元测试用例。 我编写了单元测试用例,其中预期来自测试方法MethodUnderTest的Argument Exception。假设测试用例的任何其他部分(安装部分)抛出预期的异常ArgumentException,那么我想强制我的测试用例失败。只有在安装程序正确且instance.MethodUnderTest();代码行抛出ArgumentException时才会通过。

我可以使用try catch,但我想知道有没有更好的方法来实现这一点。

[ExpectedException(typeof(ArgumentException))]
public void TestCaseMethod()
{        
    // Set up
    Mock<ITestClass> testM = new Mock<ITestClass>();
    AnimalClass instance = new AnimalClass(testM.Object);

    // call the method under test
    instance.MethodUnderTest();
}

2 个答案:

答案 0 :(得分:1)

如果您使用更高级的单元测试框架,例如NUnit。你可以做以下事情:

// Act
var result = Assert.Throws<Exception>(() => instance.MethodUnderTest));

// Assert
Assert.IsInstanceOf<ArgumentException>(result);

答案 1 :(得分:-1)

我不知道任何内置方式,但您可以在断言异常中包装该方法

private void AssertException<T>(Action method)
    where T : Exception
{
    try
    {
        method();
        Assert.Fail();
    }
    catch (T e)
    {
        Assert.IsTrue(true);
    }
}

然后用

打电话
[TestMethod]
public void TestCaseMethod()
{        
    // Set up
    Mock<ITestClass> testM = new Mock<ITestClass>();
    AnimalClass instance = new AnimalClass(testM.Object);

    // call the method under test
    AssertException<ArgumentException>(instance.MethodUnderTest)
}

或者,如果您的方法接受参数或返回值

AssertException<MyException>(() => instance.ParameterisedFunction(a, b));