2

我有一个带有 MediaElement 的类,我正在尝试为其编写单元测试,但我不知道如何对与 MediaElement 交互的部分进行单元测试。具体来说,我想确保打开文件会触发正确的代码,并且我自己的类的状态与 MediaElement 的状态一起更新。

我正在使用此处提到的 ExecuteOnUIThread() 技巧来创建和使用 MediaElement,否则我将获得 RPC_E_WRONG_THREAD 异常。

然后我使用这个技巧来测试我自己的类的事件,这些事件连接到 MediaElement 自己的 MediaOpened 和 CurrentStateChanged 事件。

但是,当我从 Internet 打开 MP3 文件时,无论我将 WaitOne 设置多长时间,我都没有看到任何东西被激活。我试过绕过我自己的类并直接测试 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)。明白了吗?同时,您可以检查它不应该是什么样的!(关闭|暂停|停止)。等等。您可能无法在一个小的 ole 单元测试中检查流本身。但是你应该能够检查状态。

祝你好运!

于 2012-10-05T22:36:59.473 回答