Як перевірити асинхронний код за допомогою MSTest


88

Я пишу суперпростий асинхронний код. Просто збереження файлу поза потоком.

Я хотів би протестувати цей код за допомогою модульного модульного тесту MSTest у Microsoft Visual Studio Team System 2008.

Як це зробити?

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

Я бачу багато для Silverlight, але нічого загального.


4
Дублікат? stackoverflow.com/questions/1174702/… (я думаю, що надані відповіді безпосередньо не пов’язані з тим, яка система тестування використовується)
Фредрік Мерк,

1
так це - і відповідь буде такою ж, я думаю.
Андраш Золтан

Відповіді:


161

Visual studio 2012 (раніше відомий як "Visual Studio 11") представив підтримку асинхронних тестів . Це виглядає так:

[TestMethod]
public async Task FooTest()
{
   var result = await SomeAsyncOperation();
   Assert.IsTrue(someCondition);
}

Як було відзначено в коментарях, що повертається тип має важливе значення . Це не буде працювати, якщо ви оголосите метод як повертається .Taskvoid


58
Зверніть увагу, що Taskтип повернення є обов’язковим - voidне працюватиме (принаймні, не в оновлення 4 VS2013)
Охад Шнайдер

3
(Це ніколи не спрацює, оскільки void-повернення асинхронних методів не можна чекати)
Річард Салай,

1
@RichardSzalay: це можна змусити працювати, подивіться тут, як це робить NUnit: stackoverflow.com/questions/15031681/…
Вім Коен

-3

Замість того, щоб безпосередньо викликати методи System.IO, спробуйте скористатися бібліотекою SystemWrapper . Потім у своїх тестах ви можете висміювати дзвінки як завгодно, повертати все, що вам подобається, назад до вашого тесту, включаючи умови помилок, і перевіряти, що ваша логіка працює належним чином.

Якщо ви хочете побачити приклад, перегляньте цю публікацію в блозі, де показано, як її можна використовувати з RhinoMocks.


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