Чому не вдається розпізнати модульні тести “async void”?


79

async void не можна запускати модульні тести в Visual Studio 2012:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

Якщо я хочу мати асинхронний модульний тест, метод тесту повинен повернути Завдання:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

Чому це так? Не те, що мені абсолютно необхідний async voidметод тестування, мені просто цікаво. Visual Studio 2012 не видає жодного попередження та помилок під час створення async voidметоду тестування, хоча його неможливо запустити ...

Відповіді:


83

async voidметоди слід розглядати як "Вогонь і забути" - не можна чекати, поки вони закінчаться. Якби Visual Studio розпочав один із цих тестів, він не міг би дочекатися завершення тесту (позначити його як успішний) або затримати будь-які винятки.

За допомогою async Task, абонент може чекати завершення виконання та фіксувати будь-які винятки, викликані під час запуску.

Дивіться цю відповідь для подальшого обговорення async voidпроти async Task.


3
Це не правда. NUnit проводить async voidтести на підтримку, а також те, як і чому підтримувати це, певною мірою описано в цьому посиланні . Дивіться відповідь нижче.
Анупам,

21

Це просто тому, що MSTest не підтримує модульні async voidтести. Це можливо зробити, ввівши контекст, в якому вони можуть виконувати.

MSTest цього не підтримує, можливо, тому, що Microsoft вирішила, що це занадто багато змін для існуючих тестів (можливо, існуючі тести зайшли б у глухий кут, якщо б їм дали несподіваний контекст).

Немає попередження / помилки компілятора, оскільки це цілком дійсний код C #. Єдина причина, через яку це не працює, полягає в структурі модульного тестування (тобто, я вважаю, що xUnit підтримує async voidтести), і компілятор C # розгляне ваші атрибути та визначить вас грубим порушенням використовуєте MSTest і вирішите, що ви дійсно не хотіли використовувати async void.


1
У першій реалізації (Visual Studio Preview) тест буде повторно розроблений і "запущений". Проблема полягала в тому, що метод закінчиться з першого очікування, і це було результатом тесту.
Паулу Моргадо,

21

Я виявив у VS2015, що будь-які методи тесту, прикрашені асинхронізацією, не відображатимуться у Провіднику тестів. У підсумку я видалив ключове слово async і замінив виклик await у тесті на task.Wait () і зробив свої твердження щодо task.Result.

Здається, працює нормально. Ще не пробував, за винятком тестування.

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);

3
Не думайте, що потрібно викликати task.Wait () як виклик task.Result автоматично викликати task.Wait (), якщо завдання не закінчилося.
stt106
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.