4

コードベース内のすべてのWPFコントロールにAutomationProperties.AutomationId属性があることを確認する方法が必要です。(これは自動UIテストに必要です。)また、コードベースに追加される可能性のある将来のすべてのフォームで、この要件が将来適用されることを確認する必要があります。私はいくつかの異なるアプローチを検討しましたが、これまでのところ、それらのどれも正しいアプローチのようには見えません。

オプション1:アプリケーション内のすべてのWPFフォームの単体テストを記述します。

これはかなり簡単なアプローチです。DependencyControlのすべての論理的な子孫をチェックし、各子孫がAutomationIdを持っていることを確認するメソッドをすでに作成しました。ここにいくつかのC#があります:

    private bool AllControlsHaveAutomationId(DependencyObject control)
    {
        bool result = true;

        if (this.ControlHasAutomationId(control))
        {
            foreach (object o in LogicalTreeHelper.GetChildren(control))
            {
                FrameworkElement frameworkElement = o as FrameworkElement;
                if (frameworkElement != null)
                {
                    result = this.AllControlsHaveAutomationId(frameworkElement);
                }
            }
        }
        else
        {
            result = false;
        }

        return result;
    }

    private bool ControlHasAutomationId(DependencyObject control)
    {
        return !string.IsNullOrEmpty(AutomationProperties.GetAutomationId(control));
    }

このアプローチの問題は、他の開発者がフォームの単体テストを作成すると想定していることですが、これは適切な想定ではありません。AutomationIdsがすべてのWPFコントロールに追加されると想定できない場合は、単体テストも作成されるとは想定できません。

オプション2:System.Xml.XmlDocumentを使用して各XAMLファイルを読み取ります。ドキュメント内のAutomationProperties.AutomationIdの要素を確認してください。

このアプローチは有望なようです。私の当初の計画は、各XAMLファイルをXmlDocumentにロードし、ドキュメント内の各要素のAutomationProperties.AutomationId属性を確認することでした。ただし、XAMLのすべての要素タイプがAutomationProperties.AutomationId属性をサポートしているわけではないことに気付きました。必要なのは、XAMLファイル内の要素を読み取り、その要素がAutomationProperties.AutomationId属性をサポートしているかどうかを判断する方法です。これを行う方法はありますか?

4

1 に答える 1

0

コードベースのすべてのアセンブリで BAML (コンパイルされた XAML) を確認できます。これにはさまざまな方法があります。

.NET Reflector と AddIn を介して BAML を見る

これを行う 1 つの方法は、Reflector アドインを作成することです。

おそらく、すでに利用可能な BAML Viewer をベースにすることができます。

次に、リフレクターにアセンブリを渡して、自動化 ID を使用せずに検索してもらうだけのケースになることを願っています。

StylesExplorer で BAML を見る

クラスを使用してアセンブリ内の BAML にアクセスできますBamlAssembly

LocBAML 経由で BAML を見る

ツールのソース コードは、Windows SDK で入手できます。ローカライズ可能なプロパティではなく、自動化プロパティを探すように変更できます。

XamlReader.Load() の使用

XamlReader.Load()コンパイルされていない .xaml ファイルを使用して、単独でどこかに到達することさえあります。

XamlReader.LoadBaml() の使用

その他のオプション

さまざまな自動化のランタイム検証ツール

于 2012-08-24T18:55:29.533 に答える