testfx icon indicating copy to clipboard operation
testfx copied to clipboard

Add relaxed versions of Assert.ThrowsException and Assert.ThrowsExceptionAsync

Open Evangelink opened this issue 1 year ago • 3 comments

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.

Evangelink avatar Dec 06 '24 13:12 Evangelink

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.

nohwnd avatar Dec 09 '24 12:12 nohwnd

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:

  1. Add 2 new APIs (Throws(Async) and ThrowsExactly(Async))
  2. Add an analyzer + code fix to change ThrowsException(Async) into ThrowsExactly(Async)
  3. In v4 either obsolete the older API or obsolete in a later release and drop in v4

Evangelink avatar Dec 12 '24 12:12 Evangelink

Re-opening to track breaking change of removing the old APIs.

Youssef1313 avatar Jun 12 '25 18:06 Youssef1313