I need to write a unit test for the next function and I saw I can use [ExpectedException]
this is the function to be tested.
public static T FailIfEnumIsNotDefined<T>(this T enumValue, string message = null)
where T:struct
{
var enumType = typeof (T);
if (!enumType.IsEnum)
{
throw new ArgumentOutOfRangeException(string.Format("Type {0} is not an Enum, therefore it cannot be checked if it is Defined not have defined.", enumType.FullName));
}
else if (!Enum.IsDefined(enumType, enumValue))
{
throw new ArgumentOutOfRangeException(string.Format("{1} Value {0} is not does not have defined value in Enum of type {0}. It should not be...", enumType.FullName, message ?? ""));
}
return enumValue;
}
and here would go the code to test the exceptions that are supposed to be threw
[TestMethod]
[ExpectedException(ArgumentOutOfRangeException(ArgumentException), "message")]
public void FailIfEnumIsNotDefined_Check_That_The_Value_Is_Not_Enum()
{
// PREPARE
// EXECUTE
// ASSERT
}
I don't have idea have to make the assert for the exceptions either.
Assert the exception is throw with the correct exception message with :
You don't need an assertion if you're using ExpectedException attribute, in fact your code shouldn't be able to arrive at the assertion.
look: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.expectedexceptionattribute.aspx
If you want to be sure the exception is thrown you should put an Assert.Fail() after the operation that should throw the exception, in this case if the exception is not thrown, the test will fail.
While
ExpectedException
cannot be used as-is to verify the exception's message, you could implement your own exception validation logic by inheriting fromExpectedExceptionBaseAttribute
:In your case, it could look something like this:
HAving said that, I would still be inclined to use the direct
try
-catch
approach though as it is more specific in where exactly the exception is expected to be thrown:ExpectedException
just asserts that exception of specified type will be thrown by test method:If you want to assert other parameters of exception, then you should use
try..catch
in your test method:You can write your own method for asserting exception was thrown to avoid repeating same test code over and over again:
Usage:
You must use
ExpectedException
differently:and then code your test so that the expected exception gets thrown.