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

使用Nunit,如何测试方法是否捕获了异常

测试异常是否被捕获本身就是一个毫无意义的测试。您应该测试catch块中发生了什么,这将验证异常是否被捕获。

如果您可以验证您的MessageContainer。实例有DataInvalid错误信息,这是你最好的选择