Некоторая ошибка в тесте кода поднимает этот вопрос, из-за расширения кода, вот полный проект, который точно воспроизводит нашу проблему (чтобы не анализировать тонны строк).
Проблема это при попытке поймать исключение из асинхронного метода, здесь файл AsyncTest.cs
:
using System;
using Xunit;
namespace AsyncTest
{
public class AsyncTest
{
[Fact]
public void ProbeTest()
{
// Arrange
var probe = new Probe();
// Act
Action action = async () =>
await probe.GetJob();
// Assert
var ex = Assert.Throws<InvalidOperationException>(action);
Assert.Contains("Trouble with Project.", ex.Message);
}
}
}
Теперь тестируемый класс Probe.cs
(обратите внимание на задержку и выброс исключения в GetById
метод, вызываемый методом GetJob
):
using System;
using System.Threading.Tasks;
namespace AsyncTest
{
class Probe
{
public async Task<MyResult<Guid>> GetJob()
{
var etlJob = await GetById("id");
return new MyResult<Guid>(etlJob);
}
public async Task<Guid> GetById(string id)
{
await Task.Delay(200);
throw new InvalidOperationException("Trouble with Project.");
}
}
}
Наконец, класс MyResult.cs
, используемый Probe.cs
.
namespace AsyncTest
{
public class MyResult<T>
{
private T _value;
public MyResult(T Value)
{
_value = Value;
}
public string Message { get; set; }
public T Data { get; set; }
}
}
По-видимому, тест заканчивается до того, как исключение выбрасывается, даже если строка await Task.Delay(200);
удалена. В некоторых случаях при использовании нескольких точек останова и размещении вызова в al oop исключение выдается, но не обнаруживается тестом.
Это похоже на синхронную и асинхронную путаницу, но не может точно определить что.
Заранее спасибо.