2013-06-19 4 views
9

У меня есть код, который использует метод HttpWebRequest класса .BeginGetResponse() и он асинхронный. Кроме того, я использую проект Microsoft Unit Test App для тестирования приложения.Единичный тест для асинхронного кода

Проблема заключается в том, что тестовая среда не ждет конца асинхронного кода, поэтому я не могу проверить его результат.

Как проверить асинхронный код с помощью проекта приложения Test Test? Я не использую модификаторы async/wait.

+1

ты thoguht об использовании издевается для веб-класса/методов? –

+0

Узел тестирования другого .Net конкретного кода по крайней мере, как класс HttpWebRequest, может показаться не очень хорошим. Потому что вы просто тестируете модуль, думая, что, если другой модуль вернет действительное значение, недопустимое значение и произведет эксплоит. Поэтому было бы лучше, если бы вы могли издеваться над HttpWebRequest и просто проверить свою логику. – srsyogesh

+0

Да, я использую mocks: сервер возвращает JSON для меня, поэтому я использую Mocks JSON для передачи его в модуль синтаксического анализа. Но теперь мне нужно добавить кеширование запросов к моей реализации API, поэтому мне нужно проверить, как он работает без отладки каждый раз. –

ответ

4

Я бы склонен к чему-то простому, например, используя цикл опроса и проверку флага, который будет установлен в асинхронном коде, или вы можете использовать события сброса. Простой пример использования темы:

[TestMethod] 
public void RunTest() 
{ 
    ManualResetEvent done = new ManualResetEvent(false); 
    Thread thread = new Thread(delegate() { 
     // Do some stuff 
     done.Set(); 
    }); 
    thread.Start(); 

    done.WaitOne(); 
} 

Вы должны думать об исключениях и использовать Try /, наконец, и сообщить ошибки, чтобы сделать это правильно, но вы получите идею. Этот метод, однако, может не уместиться, если вы много раз делаете асинхронный материал, если только вы не попросите его использовать метод многократного использования.

+0

Хорошая идея, которая отлично работает для меня! Спасибо :) P.S. вы получили ошибку в 'while (asyncDone)' он должен отрицать условие: 'while (! asyncDone)' –

+0

Спасибо, что указали, что вне - рад, что это помогает. – Ian

+0

Зачем опросить, когда есть много способов подождать завершения асинхронного кода. ('Manual/AutoResetEvent',' Monitor' и т. Д.) Или еще лучше, если вы собираетесь использовать что-то вроде выше, почему бы не просто 'thread.Join()'? – Iridium

-1

Проверьте принятый answer, который использует модуль тестирования модулей Silverlight для асинхронного тестирования модулей.

+0

Я видел, что ответ .. В предыдущем проекте я использовал Silverlight Unit Testing Framework и протестирован асинхронный код успешно, но это не поддерживается Visual Studio в качестве встроенной среды тестирования, поэтому я не вижу результатов тестов в Visual Studio. Может быть, мы будем использовать сервер непрерывной интеграции в ближайшее время, и я думаю, что у нас будут проблемы с Silverlight Unit Testing Framework –

2

Вы также можете использовать шаблон async/await (используя обертку HttpWebRequest от Microsoft.Bcl.Async nuget package). Это также будет аккуратно обрабатывать любые исключения, возникающие в фоновом потоке.

Например:

[TestMethod] 
public void RunTest() 
{ 
    bool asyncDone = false; 

    // this is a dummy async task - replace it with any awaitable Task<T> 
    var task = Task.Factory.StartNew(() => 
    { 
     // throw here to simulate bad code 
     // throw new Exception(); 

     // Do some stuff 
     asyncDone = true; 
    }); 

    // Use Task.Wait to pause the test thread while the background code runs. 
    // Any exceptions in the task will be rethrown from here. 
    task.Wait(); 

    // check our result was as expected 
    Assert.AreEqual(true, asyncDone); 
} 
0

это поздно, но я думаю, это было бы намного более читаемым и достоверный

await Task.Delay(TimeSpan.FromSeconds(5)); 
Смежные вопросы