Как обработать исключение в фоновом потоке в модульном тесте?

Я использовал бы мерзавец . Мерзавец repos является действительно маленьким и не требует демона. Можно, вероятно, установить cygwin или msysgit на карте флэш-памяти.

Редактирование: вот некоторые инструкции для установки cygwin на флеш-накопителе

6
задан sinelaw 28 August 2013 в 13:31
поделиться

3 ответа

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

Если сообщения никогда не приходят, вам нужен тайм-аут.

Битовый псевдокод (на самом деле не тот псевдокод):

private AutoResetEvent ReceiveEvent = new AutoResetEvent(false);
private EventArgs args;
private bool ReceiveCalled = false;

// event handler with some argument
private void Receive(object sender, EventArgs args)
{
  // get some arguments from the system under test
  this.args= args;

  // set the boolean that the message came in
  ReceiveCalled = true;

  // let the main thread proceed
  ReceiveEvent.Set();
}

[TestMethod]
public void Test()
{
  // register handler
  Server.OnReceive += Receive;

  var message = new Foo();
  Client.Send(message);

  // wait one second for the messages to come in
  ReceiveEvent.WaitOne(1000);

  // check if the message has been received
  Assert.IsTrue(
    ReceiveCalled, 
    "AcceptClientReceived has not been called");

  // assert values from the message
  Assert.IsInstanceOfType(args.Message, typeof(Foo))    
}

Кстати : вы все равно можете написать обработчик как лямбда-выражение и даже избежать полей, используя локальные переменные. Но было бы труднее читать, если бы все было в одном методе.

5
ответ дан 17 December 2019 в 02:31
поделиться

Я подозреваю, что вам понадобится какой-то флаг «все в порядке»:

  1. Создайте этот глобальный флаг и установите для него значение True в начале теста
  2. Напишите параллельное Assert , который очищает флаг и, возможно, устанавливает другую переменную для «причины» (или добавляет ее в список), а затем полностью завершает поток (если возможно)
  3. Заставляет основной тестовый поток ждать завершения всех других потоков затем проверьте флаг.

Возможно, в некоторых тестовых фреймворках это встроено, но я не знаю ни о каком навскидку ...

1
ответ дан 17 December 2019 в 02:31
поделиться

I tried what Stefan suggested and the following works for me:

public void TestFooMessage() {
    Foo message = null;
    var resetEvent = new AutoResetEvent(false);

    Server.OnReceive += (s, e) => {
         message = e.Message;
         resetEvent.Set();
    };

    var message = new Foo();
    Client.Send(message);

    if (resetEvent.WaitOne(1000)) {
         Assert.IsInstanceOfType(e.Message, typeof(Foo));
    } else {
         Assert.Fail("Foo not received!");
    }
}

Thanks!

0
ответ дан 17 December 2019 в 02:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: