Building Testable Windows Phone Applications from Patterns & Practices-(1)
皆様、こんにちは!
さて今回は、P & P ライブラリから、Windows Phone テスト駆動アプリケーションの構築、をご紹介しましょう。今回は前半部分のご紹介です。
このドキュメントと関連するサンプルアプリケーションを利用することにより、簡単に テスト駆動の Windows Phone アプリケーション(Windows Phone OS 7.1)を構築することが可能です。
この ”Windows Phone テスト駆動アプリケーションの構築” の中で学ぶことができるトピックとしては、下記の通りです:
対象者
このドキュメントと関連するサンプルアプリケーションは、下記のような経験を有する開発者にもっとも合致しています。
必要な経験:
- C#
- Silverlight
- Windows Phone 7.0 又は 7.1 SDK
- The Model-View-ViewModel (MVVM) パターン
あったほうが良いけどなくても大丈夫な経験:
- テスト駆動での Windows Phone アプリケーションの構築
サンプルアプリケーションについて
このドキュメントに含まれるのは、いくつかの関連するサンプルアプリケーションです。いずれも、Silverlight for Windows Phone OS 7.1. で書かれています。各々のサンプルアプリケーションは、純粋に今回のドキュメントの企図する目的のデモ用であり、けっして認定にパスするための標準を示すものではありませんし、 またこの要件を満たせば Windows Phone Marketplace にAccept されるという保証がなされるものではありません。
このドキュメントには、5つの関連するサンプルアプリケーションが含まれています。:
サンプルアプリケーション | デモできる機能 |
TestableGPSSample |
Windows Phone デバイスの場所をキャプチャーし、ターゲットとなる場所とWindows Phone との距離をメーターで計算する。 |
TestableAppServices | Page ナビゲーション。 |
TestableIsolatedStorage | ユーザーが提供したテキストの分離ストレージへの保存 / 分離ストレージからの利用。 |
TestableSensors | Windows Phone デバイスに存在するマルチプルセンサーからの生データを取得して表示。 |
TestableCamera | Chooser 機能を使って撮影された写真の表示。 |
ドキュメントに関連するいくつかの関連サンプルアプリケーションにより、下記のノウハウが得られます。:
- 疎結合テスト コードを記述するために、アプリケーションに必要な機能を提供する Windows Phone SDK クラスをラップする
- ラップされたクラスを使用する
- アプリケーションのビジネス ロジックをテストする単体テストを記述する
次のリンクから、サンプルアプリケーションのコードをダウンロードすることができます。
ソリューション
各ソリューションのプロジェクト内に、ソースコードやその他のリソースが整理されています。各サンプルアプリケーションを通常構成する、主要なプロジェクトの概要を次の表に示します。
プロジェクト
説明
Microsoft.Practices.Phone.Adapters
このプロジェクトには、Windows Phone API の機能のための、インタ フェース、アダプター、ファサードが含まれます。このプロジェクトは、ここからダウンロードすることができます。
TestableApplicationName
このプロジェクトは、ビューおよびビュー モデルクラスとリソースをサポートすると共に、サンプルアプリケーションが含まれています。
Microsoft.Practices.Phone.Testing
このプロジェクトには、アダプターののモックの実装と、Microsoft.Practices.Phone.Adapters プロジェクトに含まれているファサードが含まれます。
TestableApplicationName.Tests
このプロジェクトには、アプリケーションのビジネス ロジックをテストする単体テストが含まれています。Lib プロジェクトフォルダーには、サンプル アプリケーションが使用するコンパイル済みのアセンブリが含まれています。
The MVVM Pattern
MVVM、Model - View - ViewModel のパターンは、すべての XAML プラットフォームで使用できる、単純なパターンです。その趣旨は、ユーザー インターフェイス コントロールとそのロジックの間で懸念のきれいな分離を提供することにあります。
MVVM パターンの 3 つのコアコンポーネントは下記の通りです:
Model、View、及び、ViewModel
それぞれが異なる別の役割を果たします。3 つのコンポーネント間の関係を次に示します。
コンポーネントそれぞれ他から分離されることにより:
- コンポーネントは相互に交換できる
- 内部実装は他のコンポーネントに影響を与えず変更できる
- コンポーネントは独立して動く
- 他とは独立して単体テストができる
3つのコンポーネントの責務を理解するのに加えて、各コンポーネントの相互作用を理解することも重要です。最もハイレベルでは、View は ViewModel を”知り”、ViewModel は Model を”知って”いますが、Model は ViewModel のことを”知らず”、またViewModelはView のことは”知りません”。
ViewModel は、Model クラスから View を分離し、Model は View とは無関係に進化することができます。
MVVM の詳細については、第5章 Implementing the MVVM Pattern と、第 6 章 Prism Document における Advanced MVVM Scenarios の実装、を参照してください。Windows Phone アプリケーションにおける MVVM の実装については、Developing a Windows Phone Application using the MVVM Pattern を参照してください。
View から ViewModel への接続
View にViewModel を接続するために使用することができるいくつかの方法があります。それらの中にはダイレクトリレーションとデータ テンプレートリレーションが含まれます。ViewModel ロケーターはここで使われます。なぜなら、このアプローチが意味するのは、一つのアプリケーションは単一のクラスを持っていて、ViewModelをView に接続する責任をもつという言うことだからです。
これにより、開発者は ViewModel のロケーターを使用すること、または依存関係注入コンテナーを使用して、接続を手動で実行すること、を選択することができます。
View、ViewModel ロケーター、および ViewModel の関係を次に示します。
これらのサンプル アプリケーションでView が ViewModel に接続するには、ViewModel ロケーター アプローチを使用します。このアプローチは、 (Windows Phone アプリケーションの場合のように) ページ数の限られたアプリケーションではうまく動作しますが、大規模なアプリケーションには必ずしも適切ではありません。
TestableGPSSample App.xaml ファイルから後のコード例は、どのViewModel サービスロケータ クラスかを識別し、各サンプルアプリケーションで使用できるものを示します。アプリケーションは、ViewModelLocator クラスの宣言、 <Application.Resources>、App.xaml ファイルのセクション</Application.Resources> を宣言しています。
XAML
1: <;Application
2: x:Class="TestableGPSSample.App"
3: …
4: xmlns:TestableGPSSample="clr-namespace:TestableGPSSample">;
5:
6: <Application.Resources>
7: <;ResourceDictionary>
8: <;TestableGPSSample:ViewModelLocator x:Key="ViewModelLocator"/>
9: <;/ResourceDictionary>
10: <;/Application.Resources>
11: …
12: </Application>
次のコード例は、TestableGPSSample MainPage.xaml ファイルからのもので、View がデータ コンテキストバインディングの静的リソースとしてのViewModelLocator クラスを参照する方法を示しています。
XAML
1: <;phone:PhoneApplicationPage
2: x:Class="TestableGPSSample.MainPage"
3: …
4: DataContext="{Binding Source={StaticResource ViewModelLocator},
5: Path=MainPageViewModel}"
6: …
7: <;/phone:PhoneApplicationPage>
Path 属性は、現在のページに関連付けられた ViewModel を返す ViewModelLocator インスタンスのプロパティを識別します。
次に示すコード例は、 MainPageViewModel のインスタンスを返す TestableGPSSample ViewModelLocator クラスを示しています。
C#
1: public class ViewModelLocator
2: {
3: public MainPageViewModel MainPageViewModel
4: {
5: get { return new MainPageViewModel(new GeoCoordinateWatcherAdapter
6: (GeoPositionAccuracy.High)); }}
7: }
8: }
ViewModelLocator クラスは、View を ViewModel に接続するものです。
以上です。この後は、単体テストについてご説明します。
鈴木 章太郎