Xamarin.Forms
Xamarin.FormsでのBDDユニットテスト
サーチ…
備考
NUnit Test Runnerを使用してコマンドとナビゲーションをテストするための簡単なSpecflow
なぜ私たちはこれが必要なのですか?
Xamarin.Formsでユニットテストを行う現在の方法は、プラットフォームランナー経由であるため、テストはiOS、Android、Windows、またはMacのUI環境内で実行する必要があります。IDEでテストを実行する
XamarinはXamarin.TestCloudの素晴らしいUIテストも提供しますが、単体テストランナーやローカルビルドサーバーで安価に実行している間に、BDD開発者の慣行を実装し、ViewModelsとCommandをテストする能力を備えている場合、組み込みの方法。
私は、Xamarin.FormsでSpecflowを使用して、アプリケーションに使用されるMVVMフレームワーク( XLabs 、 MVVMCross 、 Prismなど )とは無関係に 、Scenarios定義からViewModelまでの機能を簡単に実装できるライブラリを開発しました。
BDDを初めてお使いの場合は、 [Specflow out]をオンにします。
使用法:
まだインストールしていない場合は、ここから(またはVisual Studio IDEから)specflow Visual Studio拡張機能をインストールしてください : https ://visualstudiogallery.msdn.microsoft.com/c74211e7-cb6e-4dfa-855d-df0ad4a37dd6
クラスライブラリをXamarin.Formsプロジェクトに追加します。それがあなたのテストプロジェクトです。
SpecFlow.Xamarin.Formsパッケージを追加しますnugetテストプロジェクトに。
'TestApp'を継承するテストプロジェクトにクラスを追加し、ビュー/ビューモデルのペアを登録するとともに、以下のようにDI登録を追加します。
public class DemoAppTest : TestApp { protected override void SetViewModelMapping() { TestViewFactory.EnableCache = false; // register your views / viewmodels below RegisterView<MainPage, MainViewModel>(); } protected override void InitialiseContainer() { // add any di registration here // Resolver.Instance.Register<TInterface, TType>(); base.InitialiseContainer(); } }
- Specflowフックを追加するために、SetupHookクラスをテストプロジェクトに追加します。上記で作成したクラスと、あなたのアプリケーションの最初のviewmodelを提供して、以下のようにテストアプリケーションをブートストラップする必要があります:
[Binding] public class SetupHooks : TestSetupHooks { /// <summary> /// The before scenario. /// </summary> [BeforeScenario] public void BeforeScenario() { // bootstrap test app with your test app and your starting viewmodel new TestAppBootstrap().RunApplication<DemoAppTest, MainViewModel>(); } }
- xamarin.formsビューのコードビヘイビアにcatchブロックを追加して、xamarin.formsフレームワークを無視してアプリを実行する必要があります(何もしたくない):
public YourView() { try { InitializeComponent(); } catch (InvalidOperationException soe) { if (!soe.Message.Contains("MUST")) throw; } }
プロジェクトにspecflow機能を追加する(vs specflow拡張機能に付属のvs specflowテンプレートを使用)
TestStepBaseを継承するステップ・クラスを作成/生成し、scenarioContextパラメーターをベースに渡します。
ナビゲーションサービスやヘルパーを使用して、ナビゲーション、コマンドの実行、ビューモデルのテストを行います。
[Binding] public class GeneralSteps : TestStepBase { public GeneralSteps(ScenarioContext scenarioContext) : base(scenarioContext) { // you need to instantiate your steps by passing the scenarioContext to the base } [Given(@"I am on the main view")] public void GivenIAmOnTheMainView() { Resolver.Instance.Resolve<INavigationService>().PushAsync<MainViewModel>(); Resolver.Instance.Resolve<INavigationService>().CurrentViewModelType.ShouldEqualType<MainViewModel>(); } [When(@"I click on the button")] public void WhenIClickOnTheButton() { GetCurrentViewModel<MainViewModel>().GetTextCommand.Execute(null); } [Then(@"I can see a Label with text ""(.*)""")] public void ThenICanSeeALabelWithText(string text) { GetCurrentViewModel<MainViewModel>().Text.ShouldEqual(text); } }
MVVMの高度な使い方
最初の例を追加するには、アプリケーション内で発生するナビゲーションステートメントをテストするために、ViewModelにナビゲーションへのフックを提供する必要があります。これを達成するには:
- パッケージSpecFlow.Xamarin.Forms.IViewModelを追加nugetあなたのPCL Xamarin.Formsプロジェクトに
- ViewModelでIViewModelインターフェイスを実装します。これにより、単にXamarin.Forms INavigationプロパティが公開されます。
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
- テストフレームワークはこれを選択し、内部ナビゲーションを管理します
- XLabs 、 MVVMCross 、 Prismなど、MVVMフレームワークをアプリケーションに使用できます(IViewModelインターフェイスがViewModelに実装されている限り、フレームワークはそれを取得します)。