【问题标题】:Is ExpectedException used for testing more than one cases in one test method?ExpectedException 是否用于在一种测试方法中测试多个案例?
【发布时间】:2017-11-06 05:09:06
【问题描述】:

我正在为MyMethod1MyMethod2、...的几种方法中的每一种编写单元测试 对于每种方法,我想测试一个引发特定异常的案例和一个没有引发特定异常的案例。

我现在所做的是将每个方法的两个案例组合成一个测试方法:

[TestMethod]
[TestCategory("Unit")]
public void MyTest()
{     
    SetupExceptionCase();
    try
    {
        MyMethod1();
        Assert.Fail();
    }
    catch (InvalidDataException) { }

    SetupNonExceptionCase();
    try
    {
        MyMethod1();
    }
    catch (InvalidDataException)
    {
        Assert.Fail();
    }
}

如果我想使用ExpectedException 属性来替换更长的try...catch... 控件,如https://stackoverflow.com/a/933627/156458 中所建议的那样,

  • 我是否需要将我的测试方法分成两个测试方法,每个测试方法用于一个案例?

  • 如果是,在我不希望我的方法引发异常的情况下如何使用该属性?

  • 有没有什么方法我不必拆分它,因为在一个测试方法中对要测试的相同方法的两个案例进行分组可以很好地分开要测试的不同方法的测试?

谢谢。

【问题讨论】:

    标签: c# unit-testing


    【解决方案1】:

    我是否需要将我的测试方法分成两个测试方法,每个测试方法用于一个 案例?

    是的。

    如果是,我如何在我不期望的情况下使用该属性 我的方法引发异常?

    只是不要在方法中添加属性!?

    有什么方法可以不用拆分,因为两个 在测试方法中测试相同方法的情况分开 很好地测试不同方法的测试?

    我不这么认为,因为属性需要抛出异常。因此测试以第一个异常结束。但是,无论如何最好将测试拆分为单个测试用例(尽可能原子化),这样您就不必浪费时间调试/分析测试失败时出现的问题。

    【讨论】:

    • 谢谢。如果我不期望异常,那么我不使用该属性,那么我该如何应用断言?
    【解决方案2】:

    您的单元测试实际上是在测试两种不同的情况,因此从逻辑上讲,无论如何它都应该分开。但是关于使用开箱即用属性,它应用于方法,所以是的,您需要将它们分开(无论如何我都建议这样做)。

    如果是,在我不希望我的方法引发异常的情况下如何使用该属性?

    如果您不希望您的方法引发异常,请不要使用该属性。

    有没有什么方法我不必拆分它,因为在一个测试方法中将要测试的相同方法的两个案例分组很好地分开了要测试的不同方法的测试?

    无论如何,最好将测试分成单元,我不确定您认为如何将它们分组很好,但我不建议这样做。

    【讨论】:

    • 谢谢。如果我不期望异常,那么我不使用该属性,那么我该如何应用断言?
    • @Tim 使用 Assert 类。如果没有抛出异常,那么它成功了吗?如果您需要检查该方法的行为,那么您需要断言某些属性已被设置。例如Assert.Equals(property1, property2);
    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 2014-02-19
    • 2013-03-18
    • 2010-10-30
    相关资源
    最近更新 更多