1

我需要对响应 SerialDataReceived 事件的事件处理程序进行单元测试System.IO.Ports.SerialPort。此事件处理程序具有签名

void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)

因此,当我的单元测试调用该方法时,它需要一个SerialDataReceivedEventArgs实例。但是该对象有一个私有构造函数。那么如何让 aSerialDataReceivedEventArgs传递给该方法呢?

我确定我必须在这里遗漏一个明显的技术,我已经度过了漫长的一天......请给点建议吗?

4

3 回答 3

4

您可以使用反射创建所需类型的实例:

var args = typeof(SerialDataReceivedEventArgs)
  .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new [] { typeof(SerialData) }, null)
  .Invoke(new object[] { SerialData.Chars });
于 2011-08-19T15:56:18.060 回答
2

您不能直接使用私有构造函数创建类的实例。您可以使用反射来做到这一点,但这是一个非常讨厌的解决方案。

于 2011-08-19T08:11:58.363 回答
1

我最终重构了我的代码以消除私有构造函数,如下所示:

    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

但是,我认为我更喜欢 Alexander 的解决方案,因为它不需要我重构我的生产代码。

于 2011-08-19T18:23:21.290 回答