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に実装されている限り、フレームワークはそれを取得します)。