Ошибка создания дескриптора окна в модульных тестахC#

Место общения программистов C#
Anonymous
Ошибка создания дескриптора окна в модульных тестах

Сообщение Anonymous »

У меня есть несколько модульных тестов, которые тестируют приложение .NET 4.8 Windows Forms.
Некоторые из этих тестов создают экземпляр формы и выполняют тесты различной логики. Конструктор вызывает InitializeComponent, который выделяет элементы управления, к которым необходим доступ некоторым тестам.
Моя проблема заключается в том, что при запуске агента сборки в действиях github

(локально развернутый Github Enterprise. Все агенты сборки — Windows Server 2019) некоторые тесты выдают «Ошибка создания дескриптора окна» при попытке создать элементы управления. Локально все работает нормально.
Я проверил все очевидные вещи, а также некоторые неочевидные вещи, которые предложил Google.
  • Каждый тест использует при создании формы, поэтому я знаю, что все удаляется.
  • Я проверил ограничения на дескрипторы пользователя и дескрипторы GDI для каждого процесса, они по умолчанию равны 10 000 на агенте.
  • Я добавил проверку в функцию настройки, чтобы каждый модульный тест выводил значение Process.GetCurrentProcess().HandleCount на консоль и, следовательно, отображался в журналах сборки. Со временем происходит небольшое увеличение, но оно достигает максимума около 1250, поэтому на самом деле дескрипторы не заканчиваются.
  • Я проверил «кучу рабочего стола», и на моем ноутбуке ситуация такая же, как и в агенте сборки.
  • Он без проблем проведет несколько сотен тестов, прежде чем они начнут давать сбой. Как только он начинает давать сбой, они не все терпят неудачу. Некоторые проходят без проблем.
  • Я считал, что агент сборки «безголовый» и, возможно, он не может создать форму, потому что нет способа ее отобразить. Но сотни тестов, которые делают одно и то же, работают отлично.
Есть предложения?
РЕДАКТИРОВАТЬ: Вот пример трассировки стека одного из исключений.

Код: Выделить всё

  Error Message:
System.ComponentModel.Win32Exception : Error creating window handle.
Stack Trace:
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.PointToClientInternal(Point p)
at System.Windows.Forms.DataGridView.UpdateMouseEnteredCell(HitTestInfo hti, MouseEventArgs e)
at System.Windows.Forms.DataGridView.OnColumnHeadersHeightChanged(EventArgs e)
at System.Windows.Forms.DataGridView.SetColumnHeadersHeightInternal(Int32 columnHeadersHeight, Boolean
invalidInAdjustFillingColumns)
at System.Windows.Forms.DataGridView.set_ColumnHeadersHeight(Int32 value)
at READACTED.InitializeComponent() in
C:\ar_0\_work\REDACTED.designer.cs:line 566
at REDACTED.REDACTED() in C:\ar_0\_work\REDACTED.cs:line 82
Он не пытается отобразить форму, он просто ее создает.
ОБНОВЛЕНИЕ
Я переместил один из тестовых классов, в котором возникли проблемы, в отдельный тестовый проект, и проблемы для этого класса исчезли. Должна быть какая-то утечка дескрипторов, хотя я определенно избавляюсь от вещей, созданных в модульном тесте. Теперь я подозреваю, что сама форма создает что-то, что не удаляется с помощью Dispose формы. Или даже глубже.

Вернуться в «C#»