2017-11-15 4 views
0

세 가지 가능한 예외 유형 중 하나를 선택해야합니다. 이들 중 하나가 던져지면 테스트가 성공적으로 완료되어야합니다. 몇 가지 시나리오에서 [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

을 '대신? – HimBromBeere

+0

하나의 입력으로 한 동작으로 여러 예외가 발생할 수 있습니까? – CodeCaster

+0

하나의 메시지가 한 가지 예외로 돌아와야합니다. 이제는 여러 메시지를 테스트에 전달하지만 어떤 메시지가 예외를 던 졌는지 알지 못합니다. – 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<NullReferenceException>(() => DoSomething); 

당신이 좋은 오래된 시도 - 캐치 사용할 수 있습니다 : 왜`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

관련 문제