Данные Args События Тестирования NUnit


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

NB без while Вы получаете исключение нулевой ссылки на _args.Приспособление, если вы не остановитесь на нем - состояние гонки.

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);            
}

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

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

Спасибо

2 2

2 ответа:

Я бы сначала отделил тест / приспособление от необходимости чтения какого-то файла. Я бы просто отправил консервированные данные в 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);
}
System.Threading.SpinWait.SpinUntil
    (() => _args != null && _args.Fixture != null, 30000);

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

Спасибо vcsjones