Цель
Я хочу проверить отчет о ходе выполнения некоторого асинхронного вызова, который принимает IProgress. Я хочу проверить:
- если этот сообщаемый прогресс всегда находится в диапазоне [0,0; 1.0]
- имеет возрастающие значения (последнее значение ‹= следующее значение)
- сообщает 1.0 в какой-то момент, например, как последний вызов
Я хочу использовать как можно меньше фреймворков — было бы неплохо решить проблему без использования другой сторонней библиотеки.
Проблема/Мои попытки
Я попытался написать простой метод тестирования асинхронной задачи для достижения этой цели. Я вызываю метод для тестирования с ожиданием, например. await asyncCallToTest(new Progress((p) => { Assert.someting(p); }))
. И, возможно, использовать переменные стека в лямбде. Полные примеры позже.
Однако это привело к тому, что тесты прошли успешно, даже если это было невозможно, или иногда тест прошел, а затем не прошел без изменений....
Код
Я воссоздал проблемы с помощью простого автономного тестового класса:
using System;
using System.Threading.Tasks;
using NUnit.Framework;
namespace FastProgressReporter
{
public class Tests
{
[Test]
public async Task SampleOkTest()
{
await TestReporter(new Progress<double>((p) => {
Assert.GreaterOrEqual(p, 0);
Assert.LessOrEqual(p, 1);
}));
//Sometimes fails, sometims passes. Why?
}
[Test]
public async Task SampleFailTest()
{
await TestReporter(new Progress<double>((p) => {
Assert.GreaterOrEqual(p, 2); // Has to Fail, however passes.
Assert.LessOrEqual(p, 3);
}));
}
[Test]
public async Task ReportsIncremental()
{
double latestProgress = 0;
await TestReporter(new Progress<double>((p) => {
p = 1 - p; //Force Decrement...
Assert.GreaterOrEqual(latestProgress, p); //Should fail on second call
latestProgress = p;
}));
}
[Test]
public async Task ReportsOneOneOrMoreTimes()
{
double maxProgress = 0;
await TestReporter(new Progress<double>((p) => {
maxProgress = p > maxProgress ? p : maxProgress;
}));
Assert.AreEqual(0, maxProgress); //Should always fail
//Sometimes fails, sometims passes. Why?
}
// Methode under test
public static async Task TestReporter(IProgress<double> progress)
{
progress.Report(0);
await Task.Run(() => { /*Do nothing, however await*/ });
progress.Report(0.5);
await Task.Run(() => { /*Do nothing, however await*/ });
progress.Report(1);
}
}
}
Окружающая среда
VisualStudio 2019, .net-framework 4.7.2, тестовый проект NUnit3
Квеситон
Как мне надежно и правильно достигать своих целей?
Связанные вопросы
Проверка хода выполнения, о котором сообщает асинхронный вызов правильно сообщается в модульных тестах. Здесь используется сторонняя библиотека, которую я пытаюсь избежать, и вызов .Report() непосредственно внутри тестового метода, а не в асинхронном механизме, вызываемом тестом.
Спасибо за помощь.
Progress
добавит все значения в список. Затем сделайте свои утверждения по списку. (Должен быть отсортирован, не должен быть пустым, должен иметь X элементов, первый элемент должен быть A, последний элемент должен быть B...) - person Fildor   schedule 27.05.2021await Task.Delay(someMillis);
вместоawait Task.Run( () => { /* Nothing really */ });
- person Fildor   schedule 27.05.2021