1

Windows ストア プロジェクト用に作成したカスタム コントロールを単体テストしたいと考えています。「Xがtrueのときにボタンがある」などの単純なことだけです。

ただし、テスト コンテキストでコントロールをインスタンス化することさえできないようです。コンストラクターを呼び出そうとするたびに、UI コンテキストで実行されていないことに関連する例外が発生します。また、Windows ストア プロジェクトをターゲットとするコード化された UI テスト プロジェクトを作成することもできませんでした。

  • テストするコントロールをプログラムでインスタンス化するにはどうすればよいですか? WinRT UI 同期コンテキストを作成するにはどうすればよいですか?
  • 「ユーザー」コマンド イベントをプログラムでコントロールに送信するにはどうすればよいですか?
  • アプリケーション全体をプログラムでインスタンス化/ティアダウンするにはどうすればよいですか?
4

1 に答える 1

1

非インタラクティブな部分を機能させるためのハックな方法を見つけました: 関数を使用しますWindows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync

明らかですよね?ただし、ユーザーのアクションをどのようにエミュレートするかという問題は未解決のままです。

/// Runs an action on the UI thread, and blocks on the result
private static void Ui(Action action) {
    Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
        CoreDispatcherPriority.Normal, 
        () => action()
    ).AsTask().Wait();
}
/// Evaluates a function on the UI thread, and blocks on the result
private static T Ui<T>(Func<T> action) {
    var result = default(T);
    Ui(() => { result = action(); });
    return result;
}
[TestMethod]
public void SliderTest() {
    // constructing a Slider control is only allowed on the UI thread, so wrap it in UI
    var slider = Ui(() => new Slider());
    var expected = 0;
    // accessing control properties is only allowed on the UI thread, so same deal
    Assert.AreEqual(expected, Ui(() => slider.Value));
}
于 2012-10-20T07:44:53.407 に答える