为什么在 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;
有什么想法吗?
感谢您在
评论中关于调度程序呼叫的想法。我更改了我的 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 - 在我看来是给你带来麻烦的声明