Не удается подтвердить исключение в методе asyn c с Xunit - PullRequest
1 голос
/ 27 мая 2020

Некоторая ошибка в тесте кода поднимает этот вопрос, из-за расширения кода, вот полный проект, который точно воспроизводит нашу проблему (чтобы не анализировать тонны строк).

Проблема это при попытке поймать исключение из асинхронного метода, здесь файл 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 исключение выдается, но не обнаруживается тестом.

Это похоже на синхронную и асинхронную путаницу, но не может точно определить что.

Заранее спасибо.

1 Ответ

3 голосов
/ 27 мая 2020

Попробуйте сделать свой тестовый метод асинхронным и дождитесь утверждения:

    [Fact]
    public async Task ProbeTest()
    {
        // Arrange
        var probe = new Probe();

        // Act
        Func<Task> action = async () =>
            await probe.GetJob();

        // Assert
        var ex = await Assert.ThrowsAsync<InvalidOperationException>(action);
        Assert.Contains("Trouble with Project.", ex.Message);
    }
...