1

の SerialDataReceived イベントに応答するイベント ハンドラーを単体テストする必要がありSystem.IO.Ports.SerialPortます。このイベント ハンドラーには署名があります。

void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)

したがって、単体テストがメソッドを呼び出すときは、SerialDataReceivedEventArgsインスタンスが必要です。しかし、そのオブジェクトにはプライベート コンストラクターがあります。SerialDataReceivedEventArgsでは、メソッドに渡すにはどうすればよいでしょうか。

私はここで明らかなテクニックを見逃しているに違いないと確信しています.長い一日を過ごしました.何かアドバイスをお願いします.

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 に答える