Подходит ли реализация ISynchronizeInvoke для модульного тестирования? - PullRequest
0 голосов
/ 08 февраля 2020

Я хотел бы иметь возможность писать модульные тесты (стиль nunit / vstest) для некоторых производных от TextWriter классов, которые используют этот интерфейс для сериализации различных потоковых операций в потоке пользовательского интерфейса. Мы создаем и располагаем эти объекты в потоке пользовательского интерфейса в нашем приложении, но большую часть их операций мы выполняем в фоновом потоке, поскольку они выполняют блокировку вызовов RPC / SQL. Эти объекты пытаются минимизировать диспетчеризацию потока пользовательского интерфейса путем буферизации записей, и мы обнаружили ошибки, из-за которых буфер не очищается до тех пор, пока не выполнится другой код в dispose, что приведет к неправильным операциям записи.

Например, в этой реализации Write есть ошибка - вызов BaseWriter.Write в блоке else должен проверить наличие ненулевых buffer и flu sh, поскольку управление вернулось в пользовательский интерфейс нить, не полагайтесь на возвращение каретки:

public override void Write(char value)
        {
            if (this.sync.InvokeRequired)
            {
                // we do not want to perform switch for every character.
                // so let's collect them first and send out later
                if (this.buffer == null)
                {
                    this.buffer = new StringBuilder(maxBuffer);
                }
                this.buffer.Append(value);

                // if we found an end-of-line character, or buffer is grown
                // to the maximum size let's flush the buffer
                if ((value == cutOffChar) || (this.buffer.Length >= maxBuffer))
                {
                    string text = this.buffer.ToString();
                    this.buffer = null;
                    this.sync.Invoke(new StringArgumentDelegate(Write), new object[]{text});
                }
            }
            else
            {
                this.BaseWriter.Write(value);
            }
        }

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

using (var writer = new WriterObject(baseWriter))
{
   var dialog = CreateAProgressDialog(writer);
   dialog.ShowDialog(parent); 
}

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

Я с нетерпением жду предложений! ТНХ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...