1

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

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,它将引发异常?
所以我编写单元测试如下:

[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 块中没有投掷)。但我不想扔任何东西,我只想让它有能力接住。那么可以测试吗?

4

2 回答 2

4

您不能进行单元测试来检查代码块是否具有“catch”块。(间接)这样做的唯一方法是测试在给定通常会导致它抛出的输入时测试不会抛出。

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

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

于 2014-04-30T00:17:13.067 回答
2

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

如果你想捕获异常,对它做点什么,然后抛出它以便调用者捕获它,或者测试通过,那么简单

catch (Exception e)
{
    //actions....
    throw;
}

还要记住,捕获所有异常很少是一个好主意。调用代码将继续忽略异常状态,这可能会导致无法解决的问题,这可能是调试和追踪的噩梦。

于 2014-04-30T00:19:45.470 回答