ExpectedException
Özniteliği kullanmaya alternatif olarak , bazen test sınıflarım için iki yararlı yöntem tanımlıyorum:
AssertThrowsException()
bir temsilci alır ve beklenen mesajla birlikte beklenen istisnayı attığını ileri sürer.
AssertDoesNotThrowException()
aynı temsilciyi alır ve bir istisna oluşturmadığını iddia eder.
Bu eşleştirme, bir durumda bir istisnanın atıldığını, ancak diğerinin atılmadığını test etmek istediğinizde çok yararlı olabilir.
Bunları kullanarak birim test kodum şöyle görünebilir:
ExceptionThrower callStartOp = delegate(){ testObj.StartOperation(); };
AssertThrowsException(callStartOp, typeof(InvalidOperationException), "StartOperation() called when not ready.");
testObj.Ready = true;
AssertDoesNotThrowException(callStartOp);
Güzel ve düzgün ha?
Benim AssertThrowsException()
ve AssertDoesNotThrowException()
yöntemlerim aşağıdaki gibi ortak bir temel sınıfta tanımlanır:
protected delegate void ExceptionThrower();
protected void AssertThrowsException(ExceptionThrower exceptionThrowingFunc, Type expectedExceptionType, string expectedExceptionMessage)
{
try
{
exceptionThrowingFunc();
Assert.Fail("Call did not raise any exception, but one was expected.");
}
catch (NUnit.Framework.AssertionException)
{
throw;
}
catch (Exception ex)
{
Assert.IsInstanceOfType(expectedExceptionType, ex, "Exception raised was not the expected type.");
Assert.IsTrue(ex.Message.Contains(expectedExceptionMessage), "Exception raised did not contain expected message. Expected=\"" + expectedExceptionMessage + "\", got \"" + ex.Message + "\"");
}
}
protected void AssertDoesNotThrowException(ExceptionThrower exceptionThrowingFunc)
{
try
{
exceptionThrowingFunc();
}
catch (NUnit.Framework.AssertionException)
{
throw;
}
catch (Exception ex)
{
Assert.Fail("Call raised an unexpected exception: " + ex.Message);
}
}