How to simulate throwing an exception in Unit tests?

后端 未结 2 1318
盖世英雄少女心
盖世英雄少女心 2021-02-20 05:07

How can I simulate an exception being thrown in C# unit tests?

I want to be able to have 100% coverage of my code, but I can\'t test the code with exceptions that may oc

2条回答
  •  醉梦人生
    2021-02-20 05:51

    What you need is stub - an object that will simulate certain conditions for your code. For testing purposes, you usually replace real object implementation with stub (or other type of faked object). In your case, consider:

    public class MyClass
    {
        private IDataProvider dataProvider;
    
        public void MyMethod()
        {
            try
            {
                this.dataProvider.GetData();
            }
            catch (OutOfMemoryException)
            {
            }
        }
    }
    

    Now, class you are testing should be configurable at some level - so that you can easily replace real DataProvider implementation with stubbed/faked one when testing (like you said, you don't want to destroy your DB - nobody wants!). This can be achieved for example by constructor injection (or in fact, any other dependency injection technique).

    Your test then is trivial (some made-up requirement to test when exception is thrown):

    [Test]
    public void MyMethod_DataProviderThrowsOutOfMemoryException_LogsError()
    {
        var dataProviderMock = new Mock();
        dataProviderMock
            .Setup(dp => dp.GetData())
            .Throws();
        var myClass = new MyClass(dataProviderMock);
    
        myClass.MyMethod();
    
        // assert whatever needs to be checked
    }
    

提交回复
热议问题