Exemplo n.º 1
0
        public async Task ExceptionHandlerAsyncCommandTest()
        {
            var test = string.Empty;

            var command = new AsyncCommand(Execute);

            // Моделируем выброс исключения в фоновой задаче
            Task Execute(CancellationToken token)
            => Task.Run(async() =>
            {
                for (var i = 0; i < 10; i++)
                {
                    await Task.Delay(100, token);
                }

                throw new Exception("Test exception");
            }, token);

            // Запускаем фоновую задачу и ожидаем результат
            // Т.к. обработчик в команду не был передан, то ожидаем, что исключение выбросится из команды
            await TryAsync(command);

            Assert.AreEqual("Outer catch", test);

            // Указываем обработчик ошибок
            var commandWithFaultedHandler = command
                                            .WithFaultedHandlerAsync(e => Task.Run(() => test = "Command catch"));

            // Запускаем фоновую задачу и ожидаем результат
            // Т.к. обработчик в команду был передан, то ожидаем, что исключение обработается командой
            await TryAsync(commandWithFaultedHandler);

            Assert.AreEqual("Command catch", test);

            async Task TryAsync(IAsyncCommand asyncCommand)
            {
                try
                {
                    await asyncCommand.ExecuteAsync();
                }
                catch (Exception exception)
                {
                    test = "Outer catch";
                }
            }
        }