2009-10-05 4 views
1

У меня есть куча модульных тестов, которые работают над классом, который выполняет некоторые задачи асинхронно. В настоящее время я настроил класс, а затем выполнил эту функцию. Затем я перехожу к блокировке до тех пор, пока выполнение не будет завершено, а затем проверьте данные, которые мне нужны. Есть ли лучший способ, которым я могу это сделать?Тестирование класса, использующего асинхронное выполнение

До сих пор мои тесты похожи на это:

vp.Reset(); //vp is my virtual machine 
    bool wait = true; 
    Dictionary<short, Command> commands = new Dictionary<short, Command>(); 
    commands.Add(0, CommandFactory.CreateInputCommand(0, 0)); 
    commands.Add(1, CommandFactory.CreateHaltCommand()); 
    vp.OnHalted +=() => 
    { 
     wait = false; 
    }; 
    vp.InputChannels[0] =() => { return 2; }; 
    vp.CurrentProgram = commands; 
    vp.ExecuteTillHalt();//asynchronous execution of program. There's also a way to make it execute synchronously 
    while (wait) ; 
    Assert.AreEqual(vp.Registers[0], 2); 

ответ

2

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

+0

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

+0

Это также ускорит ваше тестирование, так как ваши циклы синхронизации должны быть изменены с помощью конфигурации (в некотором роде). –

0

Есть ли способ разбить это на два теста?

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

Смежные вопросы