Windows Forms メソッドの動的な呼び出し

動的呼び出しを使用すると、テスト対象アプリケーション内のコントロールの実際のインスタンスに関して、メソッドの呼び出し、プロパティーの取得、またはプロパティーの設定を直接実行できます。また、このコントロールの Silk4NET API で使用できないメソッドおよびプロパティーも呼び出すことができます。動的呼び出しは、作業しているカスタム コントロールを操作するために必要な機能が、Silk4NET API を通して公開されていない場合に特に便利です。

オブジェクトの動的メソッドは Invoke メソッドを使用して呼び出します。コントロールでサポートされている動的メソッドのリストを取得するには、GetDynamicMethodList メソッドを使用します。

オブジェクトの複数の動的メソッドは InvokeMethods メソッドを使用して呼び出します。コントロールでサポートされている動的メソッドのリストを取得するには、GetDynamicMethodList メソッドを使用します。

動的プロパティの取得には GetProperty メソッドを、動的プロパティの設定には SetProperty メソッドを使用します。コントロールでサポートされている動的プロパティのリストを取得するには、GetPropertyList メソッドを使用します。

たとえば、テスト対象アプリケーション内のコントロールの実際のインスタンスに関して、タイトルを String 型の入力パラメータとして設定する必要がある SetTitle というメソッドを呼び出すには、次のように入力します:
control.Invoke("SetTitle", "my new title")
注: 通常、ほとんどのプロパティは読み取り専用で、設定できません。
注: ほとんどのテクノロジー ドメインでは、メソッドを呼び出してプロパティーを取得する場合、Reflection を使用します。

Invoke メソッド

Windows Forms または WPF コントロールでは、Invoke メソッドを使用して、以下のメソッドを呼び出すことができます。
  • MSDN が定義するコントロールのパブリック メソッド。
  • MSDN が定義する静的パブリック メソッド。
  • ユーザーが定義する任意の型の静的パブリック メソッド。

Invoke メソッドの最初の例

Silk4NETDataGrid 型のオブジェクトでは、MSDN が System.Windows.Forms.DataGrid 型に定義しているすべてのメソッドを呼び出すことができます。

System.Windows.Forms.DataGrid クラスのメソッド IsExpanded を呼び出すには、次のコードを使用します。
//VB .NET code
Dim isExpanded As Boolean = dataGrid.Invoke("IsExpanded", 3)
//C# code
bool isExpanded = (bool) dataGrid.Invoke("IsExpanded", 3);

Invoke メソッドの 2 番目の例

AUT 内の静的メソッド String.Compare(String s1, String s2) を呼び出すには、次のコードを使用します。
//VB .NET code
Dim result as Integer = (Integer) mainWindow.Invoke("System.String.Compare", "a", "b")
//C# code
int result = (int) mainWindow.Invoke("System.String.Compare", "a", "b");

Invoke メソッドの 3 番目の例

この例では、ユーザーが生成したメソッド GetContents を動的に呼び出す方法を示します。

テスト対象アプリケーション (AUT) のコントロールの操作に使用するコードを作成できます (この例では UltraGrid)。UltraGrid の内容を取得するために、複雑な動的呼び出しを作成するのではなく、新しいメソッド GetContents を生成し、この新しいメソッドを動的に呼び出すことができます。

Visual Studio で、AUT 内の次のコードによって GetContents メソッドを UltraGridUtil クラスのメソッドとして定義します。
//C# code, because this is code in the AUT 
namespace UltraGridExtensions {
  public class UltraGridUtil {
    /// <summary>
    /// Retrieves the contents of an UltraGrid as nested list
    /// </summary>
    /// <param name="grid"></param>
    /// <returns></returns>
    public static List<List<string>> GetContents(Infragistics.Win.UltraWinGrid.UltraGrid grid) {
      var result = new List<List<string>>();
      foreach (var row in grid.Rows) {
        var rowContent = new List<string>();
        foreach (var cell in row.Cells) {
          rowContent.Add(cell.Text);
        }
        result.Add(rowContent);
      }
      return result;
    }
  }
}
UltraGridUtil クラスのコードを AUT に追加する必要があります。これは、次のようにして行います。
  • アプリケーション開発者は、クラスのコードを AUT にコンパイルできます。アセンブリがすでにロードされている必要があります。
  • テストの実行時に AUT にロードされる新しいアセンブリを作成できます。
アセンブリをロードするには、次のコードを使用します。
FormsWindow.LoadAssembly(String assemblyFileName)
次のようにして、フルパスで指定してアセンブリをロードします。
mainWindow.LoadAssembly("C:/temp/ultraGridExtensions.dll")
Location メソッドを使用してアセンブリの場所を見つけることもできます。
//VB.NET code
Dim assemblyLocation = GetType(UltraGridExtensions.UltraGridUtil).Assembly.Location
mainWindow.LoadAssembly(assemblyLocation)
//C# code
string assemblyLocation = typeof(UltraGridExtensions.UltraGridUtil).Assembly.Location;
mainWindow.LoadAssembly(assemblyLocation);
UltraGridUtil クラスのコードが AUT 内にある場合は、次のコードをテスト スクリプトに追加して、GetContents メソッドを呼び出すことができます。
var contents = (IList) mainWindow.Invoke("UltraGridExtensions.UltraGridUtil.GetContents", ultraGrid);

Invoke メソッドを呼び出す mainWindow オブジェクトは、AUT を特定しているだけなので、同じ AUT の他のオブジェクトに置き換えてもかまいません。

InvokeMethods メソッド

Windows Forms または WPF コントロールでは、InvokeMethods メソッドを使用して、ネストされたメソッドのシーケンスを呼び出すことができます。以下のメソッドを呼び出すことができます。
  • MSDN が定義するコントロールのパブリック メソッド。
  • MSDN が定義する静的パブリック メソッド。
  • ユーザーが定義する任意の型の静的パブリック メソッド。

例:カスタム データ グリッドのセルの内容のテキストでの取得

Infragistics ライブラリのカスタム データ グリッドのセルの内容をテキストで取得するには、AUT で次の C# コードを使用できます。
string cellText = dataGrid.Rows[rowIndex].Cells[columnIndex].Text;
次の C# コードのサンプルは、最初の行の 3 番目のセルの内容をテキストで取得します。
string cellText = dataGrid.Rows[0].Cells[2];
InvokeMethods メソッドを使用して同じ例をスクリプト化すると、比較的複雑なスクリプトになります。これは、対応するパラメータを持つ 5 つのメソッドを InvokeMethods メソッドに渡さなければならないためです。
// C# code
var dataGrid = mainWindow.WPFControl("@automationId='Custom Data Grid'");
// Get text contents of third cell in first row.
var rowIndex = 0;
var columnIndex = 2;

var methodNames = new List<string>();
methodNames.Add("Rows"); 			 								// Get the list of rows from the grid.
methodNames.Add("get_Item"); 								// Get a specific row from the list of rows by using the indexer method.
methodNames.Add("Cells"); 											// Get the list of cells from the the row.
methodNames.Add("get_Item"); 								// Get a specific cell from the list of cells by using the indexer method.
methodNames.Add("Text"); 												// Get the text of the cell.
      
var parameters = new List<List<object>>();
parameters.Add(new List<object>());                  // Parameters for the Rows property.
parameters.Add(new List<object>() { rowIndex });     // Parameters for the get_Item method.
parameters.Add(new List<object>());                  // Parameters for the Cells property.
parameters.Add(new List<object>() { columnIndex });  // Parameters for the get_Item method.
parameters.Add(new List<object>());                  // Parameters for the Text property.

string cellText = (string)dataGrid.InvokeMethods(methodNames, parameters);
' VB .NET code
Dim dataGrid = mainWindow.WPFControl("@automationId='Custom Data Grid'")

' Get text contents of third cell in first row.
Dim rowIndex = 0
Dim column = 2

Dim methodNames = New List(Of String)()
methodNames.Add("Rows")                   ' Get the list of rows from the grid.
methodNames.Add("get_Item")               ' Get a specific row from the list of rows by using the indexer method.
methodNames.Add("Cells")                  ' Get the list of cells from the the row.
methodNames.Add("get_Item")               ' Get a specific cell from the list of cells by using the indexer method.
methodNames.Add("Text")                   ' Get the text of the cell.

Dim parameters = New List(Of List(Of Object))()
parameters.Add(New List(Of Object)())                  ' Parameters for the Rows property.
parameters.Add(New List(Of Object) From {rowIndex})    ' Parameters for the get_Item method.
parameters.Add(New List(Of Object)())                  ' Parameters for the Cells property.
parameters.Add(New List(Of Object) From {columnIndex}) ' Parameters for the get_Item method.
parameters.Add(New List(Of Object)())                  ' Parameters for the Text property.

Dim cellText As String = dataGrid.InvokeMethods(methodNames, parameters)
このような場合に、より簡単にするアプローチは、テスト対象アプリケーションにコードを追加して、InvokeMethods メソッドを使用することです。たとえば、GetCellText メソッドを AUT に追加します。
// C# code, if the AUT is implemented in C#.
public static string GetCellText(Infragistics.Win.UltraWinGrid.UltraGrid dataGrid, int rowIndex, int columnIndex) {
  return dataGrid.Rows[rowIndex].Cells[columnIndex].Text;
' VB code, if the AUT is implemented in VB.
public static string GetCellText(Infragistics.Win.UltraWinGrid.UltraGrid dataGrid, int rowIndex, int columnIndex) {
  return dataGrid.Rows[rowIndex].Cells[columnIndex].Text;
テスト スクリプトから GetCellText メソッドを動的に呼び出して、セルの内容をテキストで取得します。
// C# code
string cellText = (string) mainWindow.Invoke("GetCellText", dataGrid, rowIndex, columnIndex);
'VB .NET code
Dim cellText As String = mainWindow.Invoke("GetCellText", dataGrid, rowIndex, columnIndex)

詳細については、「テスト対象アプリケーションにコードを追加してカスタム コントロールをテストする」を参照してください。

サポートされているメソッドおよびプロパティ

次のメソッドとプロパティを呼び出すことができます。
  • Silk4NET がサポートするコントロールのメソッドとプロパティー。
  • MSDN が定義するコントロールのパブリック メソッドとプロパティー。
  • コントロールが標準コントロールから派生したカスタム コントロールの場合、標準コントロールが呼び出すことのできるすべてのメソッドとプロパティー。

サポートされているパラメータ型

次のパラメータ型がサポートされます。
  • すべての組み込み Silk4NET

    Silk4NET 型には、プリミティブ型 (boolean、int、string など)、リスト、およびその他の型 (Point や Rect など) が含まれます。

  • 列挙型

    列挙パラメータは文字列として渡す必要があります。文字列は、列挙値の名前と一致しなければなりません。たとえば、メソッドが .NET 列挙型 System.Windows.Visiblity のパラメータを必要とする場合、次の文字列値を使用できます: VisibleHiddenCollapsed

  • .NET 構造体とオブジェクト

    .NET 構造体とオブジェクト パラメータはリストとして渡す必要があります。リスト内の要素は、テスト アプリケーションの .NET オブジェクトで定義されているコンストラクタの 1 つと一致しなければなりません。たとえば、メソッドが .NET 型 System.Windows.Vector のパラメータを必要とする場合、2 つの整数値を持つリストを渡すことができます。これが機能するのは、System.Windows.Vector 型が 2 つの整数値を引数に取るコンストラクタを持つためです。

  • その他のコントロール

    コントロール パラメーターは、TestObject として渡したり、返したりできます。

戻り値

プロパティや戻り値を持つメソッドの場合は、次の値が返されます。
  • すべての組み込み Silk4NET 型の場合は正しい値。これらの型は、「サポートされているパラメータ型」のセクションに記載されています。
  • 戻り値を持たないすべてのメソッドの場合、C# では null が、VB では Nothing が返されます。