2

当我从单元测试中运行 ShowDialog 调用时,我得到一个

System.Windows.Markup.XamlParseException:当前 SynchronizationContext 不能用作任务调度程序。

从 main 运行正常。我意识到这不是测试仪的正常使用,但是能够选择一个对话框并单击一个按钮以使用测试数据运行它以查看对话框是否有效是很有价值的。但是这个错误阻止我运行它。

在“正确”线程上运行对话框代码是否有技巧?

这是单元测试代码:

[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>
4

3 回答 3

1

为了从单元测试中显示 WPF UI,您需要生成一个新线程,确保它是单线程单元 (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-04T02:43:17.683 回答
0

我怀疑这是您的单元测试运行程序或对话框中的某些代码的问题,因为我可以使用 ReSharper 的 xUnit 运行程序很好地运行您的代码。我的对话框只包含一个用于设置的按钮DialogResult,并且测试完成,没有任何异常。

在创建对话框之前,您可以尝试在您的 UI 线程上运行它:

SynchronizationContext.SetSynchronizationContext(
    new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)
);

如果这不起作用,请尝试将其与@JudahHimango 的为测试线程创建 SynchronizationContext 的答案结合使用。

于 2013-11-04T16:16:56.720 回答
0

搜索了这个错误,看起来您可能需要设置自己的同步上下文

[SetUp]
public void TestSetUp()
{
  SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
于 2013-11-04T14:49:07.580 回答