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

时间:2015-10-22 09:08:33

标签: c# unit-testing exception nunit

我有一种方法可以在我的数据库中保存数据(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();

    }

1 个答案:

答案 0 :(得分:1)

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

如果您可以验证MessageContainer.Instance是否有该DataInvalid错误消息,那么这确实是您的最佳选择。