Подтвердить что ты не робот

Есть ли способ unit test асинхронный метод?

Я использую Xunit и NMock на платформе .NET. Я тестирую модель презентации, где метод является асинхронным. Метод создает задачу async и выполняет ее, поэтому метод возвращается немедленно, и состояние, которое мне нужно проверить, еще не готово.

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

Каковы мои варианты?

4b9b3361

Ответ 1

В вашем объекте есть какой-либо сигнал о завершении асинхронного метода, например событие? Если это так, вы можете использовать следующий подход:

[Test]
public void CanTestAsync()
{
    MyObject instance = new MyObject()
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Finished" event
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    {
        waitHandle.Set();  // signal that the finished event was raised
    } 
    instance.AsyncMethodFinished += eventHandler;

    // call the async method
    instance.CallAsyncMethod();

    // Wait until the event handler is invoked
    if (!waitHandle.WaitOne(5000, false))  
    {  
        Assert.Fail("Test timed out.");  
    }  
    instance.AsyncMethodFinished -= eventHandler;    
    Assert.AreEqual("expected", instance.ValueToCheck);
}

Ответ 2

Просто подумал, что вам может понадобиться обновление по этому поводу, поскольку ответ # 1 на самом деле рекомендует старый шаблон решить эту проблему.

В .net 4.5 + xUnit 1.9 или выше вы можете просто вернуть задачу и, при необходимости, использовать ключевое слово async из своего теста, чтобы xunit дождался завершения асинхронного теста.

Смотрите эту статью на xUnit.net 1.9

[Fact]
public async Task MyAsyncUnitTest()
{    
  // ... setup code here ...     
  var result = await CallMyAsyncApi(...);     
  // ... assertions here ...
}

Ответ 3

Мой предпочтительный метод состоит в том, чтобы издеваться и вводить фактический механизм потоковой передачи, чтобы при тестировании он не был асинхронным. Иногда это невозможно (если потоки метода являются частью фреймворка или иначе не под вашим контролем).

Если вы не можете управлять созданием потоков, то ожидаете, пока поток завершится каким-то образом, либо цикл while, либо только время ожидания, как бы длинный поток не принимал и не выполнял тест, если состояние не так как в любом случае это слишком долго.

Ответ 4

ознакомьтесь с моей статьей об модульном тестировании приложений Silverlight

http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx

Существует пример модульной проверки метода, который вызывает службу WCF асинхронно...