2017-11-15 15 views
0

3つの可能な例外のタイプから1つをチェックする必要があります。これらのいずれかがスローされた場合、テストは正常に完了する必要があります。いくつかのシナリオでは[Theory][MemberData]を使用しています。XUnit Assert.IsType()複数の予想される型を持つ

[Theory] 
[MemberData(nameof(GetInvalidMimeMessages))] 
public async Task ProcessAsync_TestFail(MimeMessage message) 
{ 
    var stub = Mock.Of<IOptions<ScrapyardFilesOptions>>(s => s.Value.ConnectionString == "UseDevelopmentStorage=true" && s.Value.Container == "exchange"); 
    var loggerMock = new Mock<ILogger<ScrapyardFilesHandler>>(MockBehavior.Loose); 
    var scrapyard = new ScrapyardFilesHandler(loggerMock.Object, stub); 
    var ex = await Assert.ThrowsAnyAsync<Exception>(() => scrapyard.ProcessAsync(message)); 

    // imagine solution somehow like that 
    Assert.IsType( 
        { 
         typeof(NullReferenceException) || 
         typeof(KeyNotFoundException)  || 
         typeof(InvalidOperationException) || 
        }, 
        ex); 
} 

private static IEnumerable<object[]> GetInvalidMimeMessages() 
{ 
    yield return new object[] { null }; 
    yield return new object[] { new MimeMessage() }; 
    yield return new object[] 
    { 
     new MimeMessage(
      new List<InternetAddress>(), 
      new InternetAddressList() { new MailboxAddress("[email protected]"), new MailboxAddress("[email protected]"), }, 
      string.Empty, 
      MimeEntity.Load(ParserOptions.Default, Stream.Null)) 
    }; 
    yield return new object[] 
    { 
     new MimeMessage(
      new List<InternetAddress>(), 
      new InternetAddressList() { new MailboxAddress("[email protected]"), new MailboxAddress("[email protected]"), }, 
      string.Empty, 
      MimeEntity.Load(ParserOptions.Default, Stream.Null)) 
    }; 
} 

このようなアサーションを取得するにはどうすればよいですか?

+2

Assert.Throws<NullReferenceException>(() => DoSomething); 

しかし、複数のものを使用すると、古き良きのtry-catchを使用することができます。you'reは、唯一の例外のアップ、あなたはこれを使用することができれば'代わりに? – HimBromBeere

+0

1つの入力で1つのアクションで複数の例外が発生するのはなぜですか? – CodeCaster

+0

テストに複数のメッセージを渡すため、1つの例外が返されるはずですが、どのメッセージが例外を投げたのかわからないためです。 – CodeCaster

答えて

2
var exceptions = new List<Type>() 
      { 
       typeof(NullReferenceException), 
       typeof(KeyNotFoundException), 
       typeof(InvalidOperationException), 
      }; 
var ex = await Assert.ThrowsAnyAsync<Exception>(() => scrapyard.ProcessAsync(message)); 
Assert.Contains(ex.GetType(), exceptions); 
+2

興味深い解決策ですが、派生型ではなく、正確な型でのみ動作します。しかし、あなたは 'NullReferenceException'や他のものから派生したものではないと思っています。 – HimBromBeere

+0

リフレクションの 'IsAssignable'と' IsSubClass'で派生した例外をチェックすることができます:https://stackoverflow.com/a/2742288/213550 – VMAtm

2

スローされる可能性のある例外がいくつかあるので、これをチェックするためにNUnitに組み込みの方法はありません。

`Assert.Throwsを使用しないのはなぜ
try 
{ 
    DoSomething(); 
} 
catch(NullReferenceException) { Assert.Pass(); } 
catch(KeyNotFoundException) { Assert.Pass(); } 
catch(InvalidOperationException) { Assert.Pass(); } 
catch(Exception) { Assert.Fail("Unexpected exception was caught"); } 
Assert.Fail("No exception was caught"); 
+0

'Assert.Pass()'のおかげで興味深い解決法をお寄せいただきありがとうございます。 – anatol

関連する問題