2017-03-16 1 views
0

NSockituteを使用してmockingとfakingしています。私はEF6で働いているとセットアップデータベースコンテキストのSaveChangesAsync-法の例外をスローするようにしたいと思います:NS substitute、例外をスローするように設定された非同期メソッドでtry catchが動作しない

try 
{ 
    var fromDatabase = await context.Entries.OfType<Document>().FirstOrDefaultAsync(d => d.Id == doc.Id); 

     if (fromDatabase == null) 
     { 
      fromDatabase = new Document(); 
      context.Entries.Add(fromDatabase); 
     } 

     PatchEntity(fromDatabase, doc); 

     await context.SaveChangesAsync(); 
    } 
    catch (DbUpdateException ex) 
    { 
     var innerException = ex.InnerException as SqlException; 

     if (innerException != null && innerException.Number == 2627) 
     { 
      errors.Add(new DbValidationError(nameof(doc.Name), "A entry with the same Name already exists under the selected parent.")); 
     } 
    } 

context.SaveChangesAsync().Throws(new DbUpdateException("", SqlExceptionHelper.CreateSqlException(2627))); 

はSaveChangesAsyncは、このように私のデータリポジトリのメソッド内で呼び出されます

そして、これは私のユニットテスト内の行です:(!)

var result = await repository.TryAddOrUpdateDocument(doc); 

残念ながら私のテストは、私のテストメソッドが例外をスローしていることを、私はCにしようとしている、その理由で失敗し続けますアーチ。一般的な例外キャッチブロックを追加しても機能しない場合、例外はキャッチされません。例外はバブリングしています。

私のテストは "public async Task ..."と宣言されていますが、単純にvoidにして、私のリポジトリのasyncメソッドで.Resultを呼び出すことは役に立ちません。何が起こっている?

答えて

2

私は問題は例外ではなく、元の呼び出しからスローされるということだと思います内部から返されたTaskdescribed hereとします。落とし穴、

Func<int> throwDbEx =() => { 
    throw new DbUpdateException("", SqlExceptionHelper.CreateSqlException(2627)); 
}; 
context.SaveChangesAsync().Returns(Task.Run(throwDbEx)); 
+0

ありがとう:

のようなものを試してみてください! –

0

私は100%確信することはできませんが、void return型で非同期でスローされた例外は自然にキャッチできないという問題に直面している可能性があります。セクションを読んで、ここで「非同期ボイドを避ける」: https://msdn.microsoft.com/en-us/magazine/jj991977.aspx それはあなたの問題を答えない場合でも、それはとにかく読む価値がある...

関連する問題