Как тестировать асинхронный код с помощью MSTest

88

Я пишу очень простой асинхронный код. Просто сохраняю файл вне потока.

Я хотел бы протестировать этот код с помощью платформы модульного тестирования MSTest в Microsoft Visual Studio Team System 2008.

Как мне это сделать?

Я хотел бы просто заблокировать тестовый метод, пока метод не вернется. Я могу представить себе несколько способов сделать это, но я потрясен, что здесь нет никаких передовых практик или вспомогательных классов.

Я многое вижу по Silverlight, но ничего общего.

Кевин Мур
источник
4
Дубликат? stackoverflow.com/questions/1174702/… (я думаю, что предоставленные ответы напрямую не связаны с тем, какой фреймворк для тестирования используется)
Фредрик Мёрк,
1
да, и ответ, я думаю, будет таким же.
Андрас Золтан,

Ответы:

163

Visual Studio 2012 (ранее известная как «Visual Studio 11») представила поддержку асинхронных тестов . Выглядит это так:

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

Как было отмечено в комментариях, возвращаемый тип имеет важное значение . Это не сработает, если вы объявите метод как возвращающий .Taskvoid

Вим Коенен
источник
59
Обратите внимание, что Taskтип возврата является обязательным - voidне будет работать (по крайней мере, не в обновлении 4 VS2013)
Охад Шнайдер
3
(Это никогда не сработает, так как - voidнельзя ожидать возврата асинхронных методов)
Ричард Салай
1
@RichardSzalay: его можно заставить работать, посмотрите здесь, как это делает NUnit: stackoverflow.com/questions/15031681/…
Вим Коенен
-3

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

Если вы хотите увидеть пример, прочтите это сообщение в блоге, в котором показано, как его можно использовать с RhinoMocks.

Ричард Бэнкс
источник
3
Я не вижу в этом ответа на вопрос
SteveC