使用Nunit,如何测试方法是否捕获了异常
本文关键字:异常 是否 测试方法 Nunit 使用 | 更新日期: 2023-09-27 18:18:51
我有一个方法来保存数据在我的数据库(c#和Mysql)。我用的是MVP模型,它做的是保存在Presenter>保存在Service>保存在manager>保存在dao。我在管理器中做数据完整性控制。
我想测试我的演示者。第一个保存测试使用不正确的值来检查我的管理器是否抛出异常。问题是我的演示器捕获了这个异常,所以我不能使用Assert.Throws<Exception>(() => {DoSave();})
,因为Assert看不到异常。在NUnit中是否有一个Assert来检查是否在测试代码中引发了异常而没有到达测试本身?
简化后,看起来是这样的:(主持人)
private void SaveData()
{
try
{
//Calls service who calls manager who checks data then call DAO to save.
if (MyService.SaveData(currentData, ReferentielType.ENEG))
{
//Success
}
else
{
//Failure
}
}
//Thrown by the manager if the data are incorrect
catch (DataInvalidException ex)
{
// log exception as error
TraceHelper.TraceError(ex, "The data {0} is not correct", currentData.Code);
// send a message to user
MessageContainer.Instance.SendErrorMessage("DataInvalid", BusinessError.DataInvalid, currentData.Code);
}
}
}
和我的测试:
[Test]
public void UpdateDataTest()
{
//Test setup
//making fake data
//When the var etatDuTest is different from 0, it means some of the data are invalid
//Instance of the presenter
MockView view = new MockView();
PresenterToTest presenter = new PresenterToTest(view);
//Testing with invalid values
//bad label
((MockView)((IView)presenter.View)).etatDuTest = 1;
Assert.Throws<DataInvalidException>(() => { ((MockView)((IView)presenter.View)).RaiseSaveDataClicked(); });
//Bad num eva
((MockView)((IView)presenter.View)).etatDuTest = 2;
Assert.Throws<DataInvalidException>(() => { ((MockView)((IView)presenter.View)).RaiseSaveDataClicked(); });
//Testing with everything OK
//Tout est bon logiquement.
((MockView)((IView)presenter.View)).etatDuTest = 0;
((MockView)((IView)presenter.View)).RaiseSaveDataClicked();
}
测试异常是否被捕获本身就是一个毫无意义的测试。您应该测试catch块中发生了什么,这将验证异常是否被捕获。
如果您可以验证您的MessageContainer。实例有DataInvalid错误信息,这是你最好的选择