Данные аргументов событий тестирования NUnit

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

NB Без while вы получите исключение нулевой ссылки для _args.Fixture, если только вы не установите на нем точку останова - состояние гонки.

private Parser _parser;
private ParsedArgs _args;        

[TestFixtureSetUp]
public void Setup()
{
    _parser = new Parser();
    _parser.DataParsed += DataParsed;
}

void DataParsed(object sender, ParsedArgs e)
{
    _args = e;
}

[Test]
public void TestDocParse()
{
    _parser.ParseFixture(File.ReadAllText(EventDataPath));

    while (_args == null || _args.Fixture == null) { }

    Assert.IsNotNull(_args.Fixture);
    var fixture = _args.Fixture;
    Assert.AreEqual("2F7PY1662477", fixture.Id);            
}

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

Я стремлюсь проверить, что приспособление.Id равно «2F7PY1662477».

Спасибо


person Matt Canty    schedule 10.07.2012    source источник
comment
Я бы использовал System.Threading.SpinWait.SpinUntil(() => _args != null && _args.Fixture != null, 30000); для одного, просто чтобы убедиться, что ваш тест никогда не застрянет в цикле. Вы также можете использовать событие автоматического сброса или что-то в этом роде.   -  person vcsjones    schedule 10.07.2012
comment
Здесь есть пара вещей. Во-первых, конечно, вы крутитесь, ожидая завершения синтаксического анализатора. и во-вторых, это не только тестирование синтаксического анализатора, но и тестирование событий. Тест немного бессмыслен, потому что вы никогда не завершите цикл while и не проверите, что _args.Fixture не равен нулю.   -  person Peter Ritchie    schedule 10.07.2012
comment
Нет, это работает ... Я просто знаю, что застрял в петле. Вы поднимаете вопрос о том, что на самом деле я также тестирую две части.   -  person Matt Canty    schedule 11.07.2012


Ответы (2)


Я бы сначала отделил test/fixture от необходимости чтения какого-то файла. Я бы просто отправил готовые данные в ParseFixture — вы либо проверяете, можете ли вы анализировать файл, либо проверяете, вызывается ли ожидаемое событие.

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

Тогда у меня будет флаг, который сигнализирует о том, произошло ли действительное событие.

Например:

private bool eventOccurred;
private void DataParsed(object sender, ParsedArgs e)
{
   eventOccurred = e.Id == "2F7PY1662477";
}

[Test]
public void TestDocParse()
{
    _parser.ParseFixture(TextToParse);
    Assert.IsTrue(eventOccurred);
}
person Peter Ritchie    schedule 10.07.2012
comment
Это все еще не работает. Я переместил синтаксический анализ в [TestFixtureSetup] только для того, чтобы убрать его. На данный момент мне больше всего нравится SpinWait, потому что он позволяет просто добавить тайм-аут. - person Matt Canty; 11.07.2012
comment
Но дело в том, что вы хотите просто проверить события, а не тот факт, что что-то происходит в фоновом режиме. Если вы избегаете синтаксического анализа в фоновом режиме, вам не нужно ожидание вращения или время. - person Peter Ritchie; 11.07.2012
comment
Ах, извините, может быть, я не был ясен. Я хочу проверить, правильно ли проанализирован Fixture Id как 2F7PY1662477. - person Matt Canty; 12.07.2012
comment
Верно, это было сделано в методе DataParsed. Там вам не нужен какой-либо тест на то, было ли событие вызвано (например, проверка args и args.Fixture), потому что вы обрабатываете событие. Затем мы можем проверить правильность события, проверив там Id, объединить все это в одно логическое значение и утверждать об этом. - person Peter Ritchie; 12.07.2012

System.Threading.SpinWait.SpinUntil
    (() => _args != null && _args.Fixture != null, 30000);

Это гарантирует, что синтаксический анализатор завершил свою работу, однако он не оставит мои тесты запущенными, если где-то возникла проблема.

Спасибо

person Matt Canty    schedule 11.07.2012
comment
Итак, как я могу проверить, что Id == 2F7PY1662477, сохраняя при этом возврат метода синтаксического анализа недействительным? - person Matt Canty; 13.07.2012
comment
Мой пример показывает, как это сделать. Обработчик событий (DataParse) обрабатывает событие, когда он обрабатывает событие, он проверяет, что Id является ожидаемым значением, это подтверждает, что событие произошло правильно (хранится как поле eventOccured в тестовом классе). Затем тестовый метод утверждает, что событие Occured истинно. Это предполагает, что ParseFixture является синхронным и событие возникает перед возвратом из ParseFixture. Это важно в тестах; асинхронность в тестах очень затрудняет точное тестирование. - person Peter Ritchie; 13.07.2012