はじめに
前回はSilverlightで単体テストを行うための環境の構築と,APIの簡単なテストを紹介しました。後編となる今回は,その続きとしてUIのテストと非同期のテストを紹介します。
今回,使用するVisualStuidoのソリューションやプロジェクト,クラスなどは前回のものを引き続き使用します。
テストクラスの準備
初めにSilverlightプロジェクトのPageクラスをテストするためのテストクラスを作成しましょう。このテストクラスは後ほど紹介するUIのテストと非同期のテストの両方で使用します。
[新しい項目の追加]でテンプレートに[Silverlight Test Class]を選択し,ファイル名をPageTest.csとして保存してください。
追加されたPageTest.csを開いて,内容を以下のように編集します。
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Microsoft.Silverlight.Testing;
namespace SLUnitTest.Tests
{
[TestClass]
public class PageTest : SilverlightTest //①
{
private Page page = null;
[TestInitialize] //②
public void Pageの初期化()
{
page = new Page();
//③
this.Silverlight.TestSurface.Children.Add(page);
}
}
}
まず①ではSilverlightTestクラスを親クラスに設定しています。このSilverlightTestクラスは以下のような機能を持ちます。
- RootVisualとHTML DOMとのブリッジ機能
- Sleepなどのヘルパーメソッド
- 非同期テストのためのヘルパーメソッド
続いて②ではTestInitialize属性が付加された「Pageの初期化」メソッドを宣言しています。このメソッドは各テストメソッドが実行される前に毎回実行されます。
「Pageの初期化メソッド」の中では,まずテスト対象のPageクラスがインスタンス化されて,続いて③の部分でTestSurfaceの子供にそのインスタンスを追加しています。このTestSurfaceはテストを実行したときの画面の左側にあるPanelであり,ここにテスト対象のオブジェクトを追加することで,Silverlightの表示階層に追加され,UIのテストを実行することが可能になります。このTestSurfaceは各テストが終了するたびに初期化されるため,毎回設定する必要があります。
では,まずはUIのテストのためにPageクラスにテスト対象となる機能を追加します。
テストの対象となる機能を追加
Pageクラスに以下のような機能を追加し,それをテストすることにします。
- ボタンが押されたら,TextBlockに「Hello world」と表示される。
まずはPageクラスに上記の機能を追加します。Page.xamlにルートのGrid要素以下にButtonとTextBlockをStackPanelでならべて追加してください。以下のようになります。
<StackPanel>
<TextBlock x:Name="messageTextBlock" />
<Button x:Name= "messageButton"
Click="Button_Click" Content="メッセージ" />
</StackPanel>
次にボタンがクリックされた時の処理をPage.xaml.csに記述します。クリックイベントを処理するButton_Clickメソッドを定義して,その中でmessageTextBlockのTextプロパティに「Hello world」を設定します。
private void Button_Click(object sender, RoutedEventArgs e)
{
messageTextBlock.Text = "Hello world";
}
UIのテストコードを追加
さっそくテストコードを記述したいところですが,その前にもう一つテスト対象のPageクラスに準備するものがあります。それはボタンがクリックされたことをシミュレートするために外部から呼び出せるメソッドを追加することです。
今回取り上げているテスティングフレームワークはキーボードやマウス操作のシミュレートを行うことはできません。そのため,そのような処理をテストする場合は,キーボードやマウス操作が行われたことを擬似的に再現するメソッドを対象となるクラスに準備し,外部からそのメソッドを呼ぶ必要があります。
具体的には対象となるクラス,つまりこの場合Pageクラスに以下のようなメソッドを追加します。
/// <summary>
/// for test
/// </summary>
internal void SimulateButtonClick()
{
Button_Click(messageButton,new RoutedEventArgs());
}
ここではSimulateButtonClickというメソッドを定義し,実際にボタンのクリックイベントで呼ばれるButton_Clickメソッドを直接呼び出すようにして,ボタンがクリックされたことをシミュレートしています。
このSimulateButtonClickメソッドはinternalで定義されています。このメソッドを別のアセンブリであるテストプロジェクトのアセンブリから呼び出せるように,以下をSilverlightプロジェクトのAssemblyInfoに定義します。
[assembly: InternalsVisibleTo("SLUnitTest.Tests")]
上記のInternalVisivleTo属性を設定することで,テストプロジェクトのアセンブリから,Silverlightプロジェクトのアセンブリのinternalで設定されているメソッドやプロパティ,クラスなどにアクセスすることが可能になります。

