Как создать экземпляр типа с закрытым конструктором для модульного тестирования? - PullRequest
1 голос
/ 19 августа 2011

Мне нужно выполнить модульное тестирование обработчика событий, который отвечает на событие SerialDataReceived System.IO.Ports.SerialPort.Этот обработчик событий имеет подпись

void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)

Поэтому, когда мой модульный тест вызывает метод, ему требуется экземпляр SerialDataReceivedEventArgs.Но у этого объекта есть приватный конструктор.Итак, как мне заставить SerialDataReceivedEventArgs перейти в метод?

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

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Вы можете создать экземпляр нужного типа, используя отражение:

var args = typeof(SerialDataReceivedEventArgs)
  .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new [] { typeof(SerialData) }, null)
  .Invoke(new object[] { SerialData.Chars });
2 голосов
/ 19 августа 2011

Вы не можете напрямую создавать экземпляры классов с закрытыми конструкторами. Вы можете использовать рефлексию, но это довольно неприятное решение.

1 голос
/ 19 августа 2011

Я в конечном итоге реорганизовал свой код, чтобы исключить закрытый конструктор, например:

    private void HandleSerialDataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        SerialDataReceived(sender, e.EventType);
    }

    /// <summary>
    ///   This method executes in response to the <see cref="ISerialPort.DataReceived"/> event
    ///   via <see cref="HandleSerialDataReceived"/> and is called on its own worker thread.
    /// </summary>
    internal void SerialDataReceived(object sender, SerialData eventType)
    {
     ...
    }

Так что теперь я могу выполнить свое модульное тестирование на SerialDataReceived и передать ему параметр SerialData напрямую.

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

...