XUnit Assert.IsType() 具有多种预期类型
XUnit Assert.IsType() with multiple expected types
我需要检查三种可能的异常类型中的一种。如果其中之一被抛出,测试应该成功完成。我在几种情况下使用 [Theory]
和 [MemberData]
。
[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("ExchangeScrapyard@ol.su"), new MailboxAddress("exchange+scrapyard@Olex.su"), },
string.Empty,
MimeEntity.Load(ParserOptions.Default, Stream.Null))
};
yield return new object[]
{
new MimeMessage(
new List<InternetAddress>(),
new InternetAddressList() { new MailboxAddress("ExchangeOLC449@ol.su"), new MailboxAddress("exchange+olc@Ol.su"), },
string.Empty,
MimeEntity.Load(ParserOptions.Default, Stream.Null))
};
}
我怎样才能得到这样的断言?
由于您有多个可能的异常要抛出,因此 NUnit 中没有内置的方法来检查它。如果你只需要一个例外,你可以使用这个:
Assert.Throws<NullReferenceException>(() => DoSomething);
但是对于多个你可以使用旧的 try-catch:
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");
var exceptions = new List<Type>()
{
typeof(NullReferenceException),
typeof(KeyNotFoundException),
typeof(InvalidOperationException),
};
var ex = await Assert.ThrowsAnyAsync<Exception>(() => foo.Bar());
Assert.Contains(ex.GetType(), exceptions);
我需要检查三种可能的异常类型中的一种。如果其中之一被抛出,测试应该成功完成。我在几种情况下使用 [Theory]
和 [MemberData]
。
[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("ExchangeScrapyard@ol.su"), new MailboxAddress("exchange+scrapyard@Olex.su"), },
string.Empty,
MimeEntity.Load(ParserOptions.Default, Stream.Null))
};
yield return new object[]
{
new MimeMessage(
new List<InternetAddress>(),
new InternetAddressList() { new MailboxAddress("ExchangeOLC449@ol.su"), new MailboxAddress("exchange+olc@Ol.su"), },
string.Empty,
MimeEntity.Load(ParserOptions.Default, Stream.Null))
};
}
我怎样才能得到这样的断言?
由于您有多个可能的异常要抛出,因此 NUnit 中没有内置的方法来检查它。如果你只需要一个例外,你可以使用这个:
Assert.Throws<NullReferenceException>(() => DoSomething);
但是对于多个你可以使用旧的 try-catch:
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");
var exceptions = new List<Type>()
{
typeof(NullReferenceException),
typeof(KeyNotFoundException),
typeof(InvalidOperationException),
};
var ex = await Assert.ThrowsAnyAsync<Exception>(() => foo.Bar());
Assert.Contains(ex.GetType(), exceptions);