私はいくつかの例外を処理しており、一度処理した例外を再スローしません。単体テストで例外が呼び出されたと断言するにはどうすればよいですか。
4 に答える
あなたの質問のコメントに基づいて:
私が処理している多くの異なる例外をスローする可能性のあるレガシー アプリケーション インターフェースが原因でメッセージの 1 つが失敗した場合、私は第一線のサポートに電子メールを送信しています。私のテストでは、例外がスローされて処理されたとアサートできればよいでしょう。
これを処理する最もクリーンな方法は、例外を処理してメールとして渡すコードが、コンストラクターのインターフェイスとしてメール送信者を受け取るようにすることです。
次に、電子メール ハンドラーをモックし、それをテスト対象のコードに渡し、適切な種類の例外が与えられたことをアサートできます。
このようなもの:
public interface IExceptionEmailer {
void HandleGenericException( Exception e );
void HandleYourExceptionTypeA ( ExceptionTypeA e );
// ... continue with your specific exceptions
}
public class YourClassThatCatchesExceptions( ){
private IExceptionEmailer emailer;
public void TheMethodThatCatches ( ) {
try {
// actions
} catch ( ExceptionTypeA e ) {
this.emailer.HandleYourExceptionTypeA( e );
} catch ( Exception e ) {
this.emailer.HandleGenericException( e );
}
}
public YourClassThatCatchesExceptions( IExceptionEmailer emailer ) {
this.emailer = emailer;
}
}
次に、テスト クラス (Moq と Xunit を想定) は次のようになります。
public class GivenAnExceptionEmailer ( ) {
[Fact]
public void WhenYourSpecificActionHappens ( ) {
var emailer = new Mock<IExceptionEmailer>();
// ARRANGE the rest of your system here
var target = new YourClassThatCatchesExceptions( emailer.Object );
// do whatever ACTions needed here to make it throw
target.Whatever( );
// then ASSERT that the emailer was given correct type
// this will fail if the exception wasn't thrown or wasn't
// properly caught and handled.
emailer.Verify ( e =>
e.HandleYourExceptionTypeA ( It.IsAny<ExceptionTypeA>( )),
Times.Once( )
);
}
}
私はそれをテストしていないので、構文の問題が見つかるかもしれませんが、システムを隔離して、YourClassThatCatchesExceptions
火災で期待する正確な動作を確認できるようにします(そして、管理者は、大量のテスト メールでスパムを送らないことに感謝します! )
私はこのようなことをしましたが、その良い習慣かどうかはわかりません...
初め:
[TestMethod]
public void MethodName_TestErrorMessage_When_SomeException()
{
// Arrange
const string ExpectedMessgae= "Error in Application ";
this.MockedInterface.Setup(x=>x.MethodCall()).Throws<SomeException>();
// Act
var result=this.Controller.Action() as JsonResult;
// Assert
Assert.AreEqual(ExpectedMessage, result.Data.ToString());
}
これは単なる例ですが、通常、例外を再スローしておらず、コードで処理されている場合は、メッセージが正しいかどうかを確認できます。ただし、これは、少なくともコード内のスタック トレースが失われていないことを意味し、それを返します。誰かがこれを改善するのを手伝ってくれれば幸いです。もう 1 つの方法はExcpectedException
属性です。そのために例外を処理する必要はありません。
あなたのコードの外にいる人がそれを見ないことを気にする必要はありません。呼び出し元に公開されていない機能の単体テストは行いません。