Я хотел бы иметь возможность писать модульные тесты (стиль 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 в модульном тесте окажется успешной, хотя я был бы рад оказаться ошибочным.
Я с нетерпением жду предложений! ТНХ