2

単体テスト内から ShowDialog 呼び出しを実行すると、

System.Windows.Markup.XamlParseException: 現在の SynchronizationContext をタスク スケジューラとして使用できない可能性があります。

メインからの実行は正常に機能します。これはテスターの通常の使用法ではないことは承知していますが、ダイアログを選択してボタンをクリックし、テスト データで実行して、ダイアログが機能するかどうかを確認できることは価値があります。ただし、このバグにより、実行できません。

「適切な」スレッドでダイアログコードを実行するためのトリックはありますか?

単体テスト コードは次のとおりです。

[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

0

ReSharper の xUnit ランナーでコードを問題なく実行できるため、これは単体テスト ランナーまたはダイアログ内のコードに問題があると思われます。私のダイアログには を設定するためのボタンしか含まれておらDialogResultず、テストは例外なく完了します。

ダイアログを作成する前に、UI スレッドでこれを実行してみてください。

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

これが機能しない場合は、テスト スレッドの SynchronizationContext を作成するという @JudahHimango の回答と組み合わせてみてください。

于 2013-11-04T16:16:56.720 に答える