【发布时间】:2017-11-15 07:58:48
【问题描述】:
我需要检查三种可能的异常类型中的一种。如果其中之一被抛出测试应该成功完成。我在几个场景中使用[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))
};
}
我怎样才能得到这样的断言?
【问题讨论】:
-
为什么不改用
Assert.Throws? -
为什么一个输入一个动作会导致多个异常?
-
一条消息应该在一个异常中返回,因为现在您将多条消息传递到您的测试中,但您不知道哪条消息引发了哪个异常。
-
@CodeCaster 不确定我的理解是否正确,但我不应该知道哪条消息引发了哪个异常(其实我已经知道了)
-
是的,你应该这样做。您传递了四个不同的消息并期望三个不同的异常。您需要知道哪个消息导致哪个异常。如果 null 消息抛出 InvalidOperationException 怎么办?这是否意味着您的代码可以正常工作?
标签: c# unit-testing .net-core xunit.net