サーチ…


備考

  • このライブラリで内部的に使用するDIコンテナ/リゾルバはAutofacです。
  • テストフレームワークはNUnit 3xです。
  • Xamarin.Formsフレームワークでこのライブラリを使用できるはずです
  • ソースとサンプルプロジェクトはこちらから入手できます

NUnit Test Runnerを使用してコマンドとナビゲーションをテストするための簡単なSpecflow

なぜ私たちはこれが必要なのですか?

Xamarin.Formsでユニットテストを行う現在の方法は、プラットフォームランナー経由であるため、テストはiOS、Android、Windows、またはMacのUI環境内で実行する必要があります。IDEでテストを実行する

XamarinはXamarin.TestCloudの素晴らしいUIテストも提供しますが、単体テストランナーやローカルビルドサーバーで安価に実行している間に、BDD開発者の慣行を実装し、ViewModelsとCommandをテストする能力を備えている場合、組み込みの方法。

私は、Xamarin.FormsでSpecflowを使用して、アプリケーションに使用されるMVVMフレームワーク( XLabsMVVMCrossPrismなど )とは無関係に 、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; }
  • テストフレームワークはこれを選択し、内部ナビゲーションを管理します
  • XLabsMVVMCrossPrismなど、MVVMフレームワークをアプリケーションに使用できます(IViewModelインターフェイスがViewModelに実装されている限り、フレームワークはそれを取得します)。


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow