ninjectインターセプターを使用して、非同期コードの一部をさまざまな動作でラップし始めていますが、すべてを機能させるのに問題があります。
これが私が使用しているインターセプターです:
public class MyInterceptor : IInterceptor
{
public async void Intercept(IInvocation invocation)
{
try
{
invocation.Proceed();
//check that method indeed returns Task
await (Task) invocation.ReturnValue;
RecordSuccess();
}
catch (Exception)
{
RecordError();
invocation.ReturnValue = _defaultValue;
throw;
}
}
これは、ほとんどの通常の場合に正しく実行されるように見えます。これが私が期待することをするかどうかはわかりません。制御フローを非同期的に呼び出し元に返すように見えますが、プロキシが意図せずにスレッドなどをブロックしている可能性については、まだ少し心配しています。
それはさておき、例外処理を機能させることはできません。このテストケースの場合:
[Test]
public void ExceptionThrown()
{
try
{
var interceptor = new MyInterceptor(DefaultValue);
var invocation = new Mock<IInvocation>();
invocation.Setup(x => x.Proceed()).Throws<InvalidOperationException>();
interceptor.Intercept(invocation.Object);
}
catch (Exception e)
{
}
}
インターセプターでキャッチブロックがヒットしていることがわかりますが、テストのキャッチブロックが再スローからヒットすることはありません。ここにはプロキシなどがなく、非常に単純なモックとオブジェクトがあるため、私はもっと混乱しています。私も自分のテストのようなことを試しTask.Run(() => interceptor.Intercept(invocation.Object)).Wait();
ましたが、それでも変化はありません。テストは問題なく合格しますが、nUnit出力には例外メッセージがあります。
私は何かを台無しにしていると想像します、そして私は私が思っているほど何が起こっているのかよく理解していません。非同期メソッドをインターセプトするためのより良い方法はありますか?例外処理に関して何が間違っていますか?