为什么在 NUnit 测试中创建 WPF 窗口后出现无效ComObjectException

本文关键字:无效 ComObjectException 窗口 WPF NUnit 测试 创建 为什么 | 更新日期: 2023-09-27 18:32:22

我还没有能够弄清楚NUnit的这个问题。这里提出了一个类似的问题,提出了这一例外。答案解决了xUnit的使用问题,提问者报告说他让它为MSTest工作。我尝试在[TearDown][TestFixtureTearDown][Test]方法中调用Dispatcher.CurrentDispatcher.InvokeShutdown();,但仍然遇到异常。

关于我的实现的更多细节:我创建了一个扩展System.Windows.Window的InputBox类。我创建了一个静态方法,InputBox.Show(prompt)执行以下代码:

        var input = "";
        var t = new Thread(() =>
            {
                var inputBox = new InputBox(prompt);
                inputBox.ShowDialog();
                input = inputBox.Input;
            }) {IsBackground = true};
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
        return input;

有什么想法吗?

为什么在 NUnit 测试中创建 WPF 窗口后出现无效ComObjectException

感谢您在

评论中关于调度程序呼叫的想法。我更改了我的 InputBox.Show 方法,所以它现在看起来像这样,它工作得很好。我的单元测试中没有任何Dispatcher调用,也没有收到异常。

    public static string Show(string prompt)
    {
        string input = null;
        var t = new Thread(() =>
        {
            Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.Normal, new Action(() =>
            {
                var inputBox = new InputBox(prompt);
                inputBox.ShowDialog();
                input = inputBox.Input;
            }));
            Dispatcher.CurrentDispatcher.InvokeShutdown();
        }) { IsBackground = true };
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
        t.Join();
        return input;
    }

您是否在测试方法之上尝试过 [RequireMTA](使用智能来证明正确性)属性?ApartmentState.STA - 在我看来是给你带来麻烦的声明