首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从测试中运行WPF对话框

从测试中运行WPF对话框
EN

Stack Overflow用户
提问于 2013-11-04 02:35:22
回答 3查看 2K关注 0票数 2

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

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

从主要工作中跑得很好。我意识到这不是测试人员的正常使用,但是能够选择一个对话框并单击一个按钮来运行测试数据,以查看该对话框是否有效是很有价值的。但是,这个bug阻止了我运行它。

是否有一个在“适当”线程上运行对话框代码的技巧?

以下是单元测试代码:

代码语言:javascript
运行
复制
[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;
  }

窗口代码:>

代码语言:javascript
运行
复制
    <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>
EN

回答 3

Stack Overflow用户

发布于 2013-11-04 02:43:17

为了从单元测试中显示WPF UI,您需要生成一个新线程,确保它是single-threaded apartment (STA),从该线程创建UI,显示对话框,然后将结果封送回单元测试线程。

代码语言:javascript
运行
复制
var uiThread = new Thread(MyCreateAndShowUIFunction);
uiThread.SetApartmentState(ApartmentState.STA);
uiThread.Start();

...

// Wait for the UI thread to finish
uiThread.Join();

总的来说,单元测试并不打算真正启动UI。这将是一个集成测试,甚至是一个编码的UI测试。

票数 1
EN

Stack Overflow用户

发布于 2013-11-04 14:49:07

搜索这个错误,看起来您可能需要set your own sync context

代码语言:javascript
运行
复制
[SetUp]
public void TestSetUp()
{
  SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
}
票数 0
EN

Stack Overflow用户

发布于 2013-11-04 16:16:56

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

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

代码语言:javascript
运行
复制
SynchronizationContext.SetSynchronizationContext(
    new DispatcherSynchronizationContext(Dispatcher.CurrentDispatcher)
);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19760818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档