Как составить модульный тест, если за задачей следует задача task.start()?

В программе имеем:

var task1 = some task;
task1.start()

Если имитировать результат задачи в модульном тесте, результат возвращается механизмом имитации непосредственно перед вызовом start () и вызывает исключение «Пуск не может быть вызван для задачи, которая завершена».

Как решить эту проблему и составить правильный модульный тест?

Для ясности вставьте сюда упрощенный пример кода, который создает указанное выше исключение:

namespace TestTaskStart
{
    public class TestMethods : ITestMethods
    {
        public async Task<int> AlwaysReturnOne(int number)
        {
            return await Task.FromResult(1);
        }
    }
}

namespace TestTaskStart {
    public class TestInvoker
    {
        private ITestMethods testMethods;

        public TestInvoker(ITestMethods testMethods)
        {
            this.testMethods = testMethods;
        }

        public async Task<int> GetANumberWrapperTask(int number)
        {
            // just an exmple of one tasks to be called
            var task = this.testMethods.AlwaysReturnOne(number);
            task.Start();
            Task.WaitAll(task);

            return task.Result;
        }
    }
}

namespace TestTaskStart {
    [TestClass]
    public class UnitTests
    {
        ITestMethods numberGetter;
        TestInvoker testInvoker;

        [TestInitialize]
        public void Setup()
        {
            this.numberGetter = Substitute.For<ITestMethods>();
            this.testInvoker = new TestInvoker(this.numberGetter);
        }

        [TestMethod]
        public void TestGetANumberWrapper()
        {
            this.MockAlwaysReturnOneResult();
            var result = testInvoker.GetANumberWrapperTask(5).Result;
        }

        private void MockAlwaysReturnOneResult()
        {
            this.numberGetter.AlwaysReturnOne(Arg.Any<int>()).Returns(1);
        }
    }
}

Не могли бы вы заменить "какая-то задача" своим фактическим кодом?

Theodor Zoulias 09.04.2022 05:40

@TheodorZoulias спасибо за комментарий, добавьте к сообщению упрощенный образец проекта, проверили его локально с тем же исключением.

Channing 09.04.2022 07:11
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод Task.Start можно вызывать только для «холодных» задач, то есть для задач, которые еще не запущены. Такие задачи можно создавать только с помощью конструктора Task. Задачи, созданные путем вызова асинхронных методов, реализованных с помощью ключевого слова async, являются «горячими», другими словами, они уже запущены при создании. Из документов:

Exceptions
InvalidOperationException
The Task is not in a valid state to be started. It may have already been started, executed, or canceled, or it may have been created in a manner that doesn't support direct scheduling.

Это также хорошее чтение: Экскурсия по задачам, часть 10: задачи-обещания

Другие вопросы по теме