我正在使用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());
}
但测试失败了..为什么? (因为没有扔进我的拦截区)。但我不想抛出任何东西,我只是想要能够抓住。那么有可能进行测试吗?
答案 0 :(得分:4)
您无法进行单元测试来检查代码块是否具有“catch”块。 (间接)执行此操作的唯一方法是测试不会抛出给定的输入,这通常会导致它抛出。
NUnit有一个在这里应该有用的DoesNotThrow断言。
当然,这不能保证try / catch的存在,但它是关于你能做的最好的。
答案 1 :(得分:2)
myview_ButtonClick()捕获所有异常,因此它永远不会抛出可以从方法外部检测到的异常,因此测试失败。
如果你想捕获异常,用它做一些事情,然后抛出它以便调用者捕获它,或者测试通过,然后简单地
catch (Exception e)
{
//actions....
throw;
}
请记住,捕捉所有异常并不是一个好主意。调用代码将继续无视异常状态,这可能会导致无法解决的问题,这可能是调试和跟踪的噩梦。