当我在单元测试中运行ShowDialog调用时,我将得到一个
System.Windows.Markup.XamlParseException:当前的SynchronizationContext不能用作任务调度程序。
从主要工作中跑得很好。我意识到这不是测试人员的正常使用,但是能够选择一个对话框并单击一个按钮来运行测试数据,以查看该对话框是否有效是很有价值的。但是,这个bug阻止了我运行它。
是否有一个在“适当”线程上运行对话框代码的技巧?
以下是单元测试代码:
[Fact]
static public void Draw2()
{
var uiThread = new Thread(Draw20);
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.Start();
// Wait for the UI thread to finish
uiThread.Join();
}
static void Draw20()
{
ModernUIApp1.MainWindow window = new MainWindow();
System.Windows.Forms.Integration
.ElementHost
.EnableModelessKeyboardInterop(window);
window.ShowDialog();
window = null;
}
窗口代码:>
<mui:ModernWindow.MenuLinkGroups>
<mui:LinkGroup DisplayName="welcome">
<mui:LinkGroup.Links>
<mui:Link DisplayName="home" Source="/Pages/Home.xaml" />
<mui:Link DisplayName="my page" Source="/Pages/BasicPage.xaml" />
</mui:LinkGroup.Links>
</mui:LinkGroup>
<mui:LinkGroup DisplayName="settings" GroupName="settings">
<mui:LinkGroup.Links>
<mui:Link DisplayName="software" Source="/Pages/Settings.xaml" />
</mui:LinkGroup.Links>
</mui:LinkGroup>
</mui:ModernWindow.MenuLinkGroups>
<mui:ModernWindow.TitleLinks>
<mui:Link DisplayName="settings" Source="/Pages/Settings.xaml" />
</mui:ModernWindow.TitleLinks>
</mui:ModernWindow>
发布于 2013-11-04 02:43:17
为了从单元测试中显示WPF UI,您需要生成一个新线程,确保它是single-threaded apartment (STA),从该线程创建UI,显示对话框,然后将结果封送回单元测试线程。
var uiThread = new Thread(MyCreateAndShowUIFunction);
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.Start();
...
// Wait for the UI thread to finish
uiThread.Join();
总的来说,单元测试并不打算真正启动UI。这将是一个集成测试,甚至是一个编码的UI测试。
发布于 2013-11-04 14:49:07
搜索这个错误,看起来您可能需要set your own sync context
[SetUp]
public void TestSetUp()
{
SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
发布于 2013-11-04 16:16:56
我怀疑这是您的单元测试运行程序或对话框中的一些代码的问题,因为我可以在ReSharper的xUnit运行程序中很好地运行您的代码。我的对话框只包含一个设置DialogResult
的按钮,测试完成时没有任何异常。
在创建对话框之前,可以尝试在UI线程上运行此:
SynchronizationContext.SetSynchronizationContext(
new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)
);
如果这不起作用,尝试将其与@JudahHimango为测试线程创建SynchronizationContext的答案相结合。
https://stackoverflow.com/questions/19760818
复制相似问题