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 인터페이스가 구현되어 있으면 프레임 워크에서이를 가져옵니다.