Add relaxed versions of Assert.ThrowsException and Assert.ThrowsExceptionAsync
Summary
Allows to assert some derived exceptions are thrown.
Background and Motivation
Assert.ThrowsException<T> and Assert.ThrowsExceptionAsync<T> are checking that the exception throws is exactly matching the one specified as generic type argument. It can often happen that you would instead prefer to say type or derived types.
Proposed Feature
Add Assert.ThrowsAnyException<T>/Assert.ThrowsAnyExceptionAsync<T> or add overloads of the current APIs with a boolean allowing to control whether to check exact type or derived.
Alternative Designs
Relax current APIs and introduce Assert.ThrowsExactException<T> and Assert.ThrowsExactExceptionAsync. Although I prefer the naming, this would introduce a potentially strong functional breaking change for users so I would be reluctant to do it.
My preferred syntax would also be changing the current to "any" and ThrowsExactException. But I see why that is not possible.
So with that not being an option I think the proposed design is the best. I do like the name being reasonably simple.
The simplest idea would be to add ThrowsAnyException(Async) APIs but the name could be seen as confusing.
Given that in v4 we would like to ensure simplified naming, and for example remove the Exception part of the API, it seems better to:
- Add 2 new APIs (
Throws(Async)andThrowsExactly(Async)) - Add an analyzer + code fix to change
ThrowsException(Async)intoThrowsExactly(Async) - In v4 either obsolete the older API or obsolete in a later release and drop in v4
Re-opening to track breaking change of removing the old APIs.