我有一种方法可以在我的数据库中保存数据(C#和Mysql)。我使用的是MVP模型,所以它的作用是Save in Presenter>保存在服务中>保存在经理中>保存在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();
}
答案 0 :(得分:1)
测试异常被捕获本身就是一个毫无意义的测试。您应该测试catch块中发生的事情,这将验证异常是否被捕获。
如果您可以验证MessageContainer.Instance是否有该DataInvalid错误消息,那么这确实是您的最佳选择。