В программе имеем:
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);
}
}
}
@TheodorZoulias спасибо за комментарий, добавьте к сообщению упрощенный образец проекта, проверили его локально с тем же исключением.
Отчасти связано: Start нельзя вызывать для задачи в стиле обещания. исключение идет
Метод Task.Start
можно вызывать только для «холодных» задач, то есть для задач, которые еще не запущены. Такие задачи можно создавать только с помощью конструктора Task
. Задачи, созданные путем вызова асинхронных методов, реализованных с помощью ключевого слова async
, являются «горячими», другими словами, они уже запущены при создании. Из документов:
Exceptions
InvalidOperationException
TheTask
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: задачи-обещания
Не могли бы вы заменить "какая-то задача" своим фактическим кодом?