単体テストを記述しようとしている 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);
});
}