关于c#:如何测试我需要尝试catch

how to test I need try catch

本问题已经有最佳答案,请猛点这里访问。

我使用NUnit,我有以下代码将被测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class StudentPresenter
{
    IView myview;
    Repository myrepo;
    public StudentPresenter(IView vw, Data.Repository rep)
    {
        this.myview = vw;
        this.myrepo = rep;
        this.myview.ButtonClick += myview_ButtonClick;
    }

    public void myview_ButtonClick()
    {
        try
        {
         var d = this.myrepo.GetById(int.Parse(myview.GivenId));
         this.myview.GetStudent(d);
        }
        catch(Exception e)
        {
        }

    }
}

我需要测试myview_ButonClick()
让我们假设我将测试此方法,如果myview.GivenId为null,它将抛出异常?
所以我写单元测试如下:

1
2
3
4
5
6
7
8
[Test]      
public void Button1Click_NullText_ThrowException()
{
    var mock = Substitute.For<IView>();
    StudentPresenter sp = new StudentPresenter(mock, repo);
    mock.GivenId = string.Empty;
    Assert.Throws<Exception>(()=>sp.myview_ButtonClick());
}

但测试失败了..为什么? (因为没有扔进我的拦截区)。 但我不想抛出任何东西,我只是想要它能够抓住它。 那么有可能进行测试吗?


您不能进行单元测试来检查代码块是否具有"catch"块。 (间接)执行此操作的唯一方法是测试在给定通常会导致抛出的输入时测试不会抛出。

NUnit有一个在这里应该有用的DoesNotThrow断言。

当然,这不能保证try / catch的存在,但它是关于你能做的最好的。


myview_ButtonClick()捕获所有异常,因此它永远不会抛出可以从方法外部检测到的异常,因此您的测试失败。

如果你想捕获异常,用它做一些事情,然后抛出它以便调用者捕获它,或者测试通过,然后简单

1
2
3
4
5
catch (Exception e)
{
    //actions....
    throw;
}

请记住,捕捉所有异常并不是一个好主意。 调用代码将继续无视异常状态,这可能会导致无法解决的问题,这可能是调试和跟踪的噩梦。