如何测试我需要尝试捕获

时间:2014-04-30 00:12:18

标签: c# unit-testing nunit nsubstitute

我正在使用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为空,它将抛出异常?
所以我写单元测试如下:

[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());
}


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

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

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