2

単体テストを記述しようとしている MediaElement を持つクラスがありますが、MediaElement とやり取りする部分を単体テストする方法がわかりません。具体的には、ファイルを開くと正しいコードがトリガーされ、自分のクラスの状態が MediaElement と共に更新されるようにしたいと考えています。

ここで説明した ExecuteOnUIThread() トリックを使用して、MediaElement を作成して操作しています。そうしないと RPC_E_WRONG_THREAD 例外が発生するためです。

次に、このトリックを使用して、独自のクラスのイベントをテストできるようにします。このイベントは、MediaElement 独自の MediaOpened および CurrentStateChanged イベントに接続します。

ただし、WaitOne をどれだけ長く設定しても、インターネットから MP3 ファイルを開いたときに、何もアクティブ化されません。自分のクラスをバイパスして MediaElement を直接テストしようとしましたが、イベントはまったく発生していないようです。

私が取り組んでいるテスト方法は次のとおりです。

[TestMethod]
public async Task TestMethod1()
{
    await ExecuteOnUIThread(() =>
    {
        var me = new MediaElement();
        bool opened = false;
        var mre = new ManualResetEvent(false);
        me.MediaOpened += delegate
        {
            opened = true;
            mre.Set();
        };
        me.Source = new Uri("http://dl.dropbox.com/u/52389/test-song.mp3");
        mre.WaitOne(5000);

        Assert.IsTrue(opened);
    });
}
4

1 に答える 1

0

コマンドの後、CurrentState (Windows.UI.Xaml.Media.MediaElementState) を確認します。それはあなたの行動を反映するはずです。バッファリングに十分な時間があるかどうか確信が持てず、それを待ちたくない場合 (問題ありません)、複数を確認できます。たとえば、次のオプションがあります。

Closed = 0
Opening = 1
Buffering = 2
Playing = 3
Paused = 4
Stopped = 5

Play() を呼び出した後、(Opening | Buffering | Playing) を確認できます。私が何を意味するか分かりますか?同時に、どのようなものであってはならないかを確認できます !(クローズ | 一時停止 | 停止)。等々。おそらく、ちょっとした単体テストではストリーム自体をチェックすることはできません。ただし、状態を確認できるはずです。

頑張ってください!

于 2012-10-05T22:36:59.473 に答える