1

さて、録音セッション用に作成したラッパーに対して NAudio を単体テストしようとしています。録音セッションを開始および停止するコードは次のとおりです...

public void StartRecording(string claimNo, string ip_no, string ip_name)
{
    if (this.IsRecording)
    {
        return;
    }

    this.Recordings.Add(new RecordingTrack(claimNo, ip_no, ip_name));
    if (this.MicrophoneLevel == default(float))
    {
        this.MicrophoneLevel = .75f;
    }

    _aggregator.Reset();

    _input = new WaveIn();
    _input.WaveFormat = _waveFormat;

    _input.DataAvailable += (s, args) =>
        {
            _writer.Write(args.Buffer, 0, args.BytesRecorded);
            byte[] buffer = args.Buffer;
            for (int index = 0; index < args.BytesRecorded; index += 2)
            {
                short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
                float sample32 = sample / 32768f;
                _aggregator.Add(sample32);
            }

            if (this.DataAvailable != null)
            {
                this.DataAvailable(s, args);
            }

            if (!this.IsRecording)
            {
                _writer.Close();
                _writer.Dispose();
                _writer = null;
            }
        };
    _input.RecordingStopped += (s, args) =>
        {
            _input.Dispose();
            _input = null;

            if (this.RecordingStopped != null)
            {
                this.RecordingStopped(s, args);
            }
        };

    _writer = new WaveFileWriter(this.CurrentRecording.FileName, _input.WaveFormat);

    _input.StartRecording();
    this.IsRecording = true;
}

public void StopRecording()
{
    if (!this.IsRecording)
    {
        return;
    }

    this.CurrentRecording.Stop();

    this.IsRecording = false;
    _input.StopRecording();
}

...以下は私の単体テストです。ManualResetEvent発生したイベントの成功をアサートするためにa を使用しており、次のように宣言されています...

private ManualResetEvent _eventRaised = new ManualResetEvent(false);

...ただし、問題は、以下のテストが単純にロックされ、イベントが発生しないことです。同じスレッドをロックしているため、イベントの発生が許可されていないことが問題であることを確認できますか?WaitOne

bool success = false;
_eventRaised.Reset();

var target = new RecordingSession();
target.StartRecording("1", "01", "Test Name");

target.RecordingStopped += (s, args) =>
    {
        success = (target.CurrentRecording.Duration.TotalSeconds > 4);
        _eventRaised.Set();
    };

Thread.Sleep(4000);
target.StopRecording();

_eventRaised.WaitOne();

Assert.IsTrue(success);

もしそうなら、このテストを手伝ってくれませんか?私はいくつかの啓蒙が必要です。

他のクラスでイベントをテストするために何度も使用しましたが、うまくいきましたManualResetEventが、ここでは何かが異なります。

4

2 に答える 2

2

_inputメンバーが独自のスレッドで動作している場合、接続する前にイベントが発生する可能性があります。したがって、手動リセット イベントは設定されず、永遠に待機するか、単体テストがロックされます。

したがって、定義を次のように並べ替えてみてください。

target.RecordingStopped += (s, args) =>     
{         
    success = (target.CurrentRecording.Duration.TotalSeconds > 4);         
    _eventRaised.Set();     
};

target.StartRecording("1", "01", "Test Name"); 
于 2012-10-08T11:21:34.777 に答える
2

WaveIn の既定のコンストラクターはウィンドウ化されたコールバックを使用し、GUI スレッドで単体テストを実行していないため、イベントを取得することはありません。非 GUI スレッドで作業するには、代わりに WaveInEvent を使用する必要があります。最新の NAudio コードでは、この間違いを防ぐために InvalidOperationException をスローする必要があります。

于 2012-10-08T21:55:11.783 に答える