Xamarin.Forms
Xamarin.Forms의 BDD 단위 테스트
수색…
비고
NUnit Test Runner를 사용하여 명령 및 탐색을위한 간단한 Specflow
왜 우리가 이것을 필요로합니까?
현재 Xamarin.Forms에서 단위 테스트를 수행하는 방법은 플랫폼 러너를 통해 이루어 지므로 테스트는 iOS, Android, Windows 또는 Mac UI 환경 에서 실행해야합니다. IDE에서 테스트 실행
자 마린도 함께 멋진 UI 테스트를 제공 Xamarin.TestCloud의 제공하지만, BDD dev에 관행을 구현하고 로컬 또는 빌드 서버에 단위 테스트 러너에 싸게 실행하는 동안, ViewModels 및 명령을 테스트 할 수있는 능력을 가지고 싶은 경우,이 없다 내장 방식.
저는 Xamarin.Forms에서 Specflow를 사용하여 시나리오 정의에서 ViewModel까지 응용 프로그램에 사용 된 MVVM 프레임 워크 ( XLabs , MVVMCross , Prism 등 )와 독립적으로 기능을 쉽게 구현할 수있는 라이브러리를 개발했습니다.
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 뷰 코드 비헤이비어에 추가해야합니다. 그러면 xamarin.forms 프레임 워크에서 앱을 실행해야합니다 (원하지 않는 작업).
public YourView() { try { InitializeComponent(); } catch (InvalidOperationException soe) { if (!soe.Message.Contains("MUST")) throw; } }
프로젝트에 specflow 기능 추가 (vs specflow 확장과 함께 제공되는 vs specflow 템플릿 사용)
TestStepBase를 상속 한 step 클래스를 생성 / 생성하여 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에 탐색에 대한 후크를 제공해야합니다. 이것을 달성하기 위해서 :
- nuget의 SpecFlow.Xamarin.Forms.IViewModel 패키지를 PCL Xamarin.Forms 프로젝트에 추가하십시오.
- ViewModel에 IViewModel 인터페이스를 구현합니다. 이렇게하면 Xamarin.Forms INavigation 속성이 노출됩니다.
-
public class MainViewModel : INotifyPropertyChanged, IViewModel.IViewModel { public INavigation Navigation { get; set; }
- 테스트 프레임 워크가이를 선택하고 내부 탐색을 관리합니다.
- XLabs , MVVMCross , Prism 과 같은 응용 프로그램에 MVVM 프레임 워크를 사용할 수 있습니다 .ViewModel에 IViewModel 인터페이스가 구현되어 있으면 프레임 워크에서이를 가져옵니다.