Prueba unitaria de navegación del prisma
Estoy creando una aplicación usando Prism y Xamarin Forms. Quiero probar mis modelos de vista.
Tengo un comando que navega a una página. Quiero afirmar que la navegación ocurrió a la página correcta después de que se haya llamado a ese comando.
Supongo que necesito replicar el código encontrado en elPrism / Source / Xamarin / Prism.Forms.Tests / Navigation / PageNavigationServiceFixture.cs archivo.
Por ejemplo, mire este método (proveniente de la clase PageNavigationServiceFixture):
public async void Navigate_ToContentPage_ByName()
{
var navigationService = new PageNavigationServiceMock(_container, _applicationProvider, _loggerFacade);
var rootPage = new Xamarin.Forms.ContentPage();
((IPageAware)navigationService).Page = rootPage;
await navigationService.NavigateAsync("ContentPage");
Assert.True(rootPage.Navigation.ModalStack.Count == 1);
Assert.IsType(typeof(ContentPageMock), rootPage.Navigation.ModalStack[0]);
}
Crea un servicio de navegación, navega a una página y luego afirma que la página ha cambiado.
Ahora aquí está mi clase de prueba:
[TestClass]
public class MenuPrincipalViewModelTests
{
[TestMethod]
public void AProposCommand()
{
INavigationService navigationService = new PageNavigationServiceMock(_container, _applicationProvider, _loggerFacade);
// 1: Here I need to initialize my navigation service to my MasterDetailPage
MenuPrincipalPageViewModel viewModel = new MenuPrincipalPageViewModel(navigationService);
viewModel.AProposCommand.Execute();
// 2: Here I want to assert that the new navigation stack is MenuPrincipalPage/ContenuPage/AProposPage
}
PageNavigationContainerMock _container;
IApplicationProvider _applicationProvider;
ILoggerFacade _loggerFacade;
public MenuPrincipalViewModelTests()
{
_container = new PageNavigationContainerMock();
_container.Register("PageMock", typeof(PageMock));
_container.Register("ContentPage", typeof(ContentPageMock));
_container.Register(typeof(ContentPageMockViewModel).FullName, typeof(ContentPageMock));
_container.Register("NavigationPage", typeof(NavigationPageMock));
_container.Register("NavigationPage-Empty", typeof(NavigationPageEmptyMock));
_container.Register("NavigationPageWithStack", typeof(NavigationPageWithStackMock));
_container.Register("NavigationPageWithStackNoMatch", typeof(NavigationPageWithStackNoMatchMock));
_container.Register("MasterDetailPage", typeof(MasterDetailPageMock));
_container.Register("MasterDetailPage-Empty", typeof(MasterDetailPageEmptyMock));
_container.Register("TabbedPage", typeof(TabbedPageMock));
_container.Register("CarouselPage", typeof(CarouselPageMock));
_container.Register("MenuPrincipalPage", typeof(MenuPrincipalPage));
_container.Register("ContenuPage", typeof(ContenuPage));
_container.Register("ClubHousePage", typeof(ClubHousePage));
_container.Register("AProposPage", typeof(AProposPage));
_applicationProvider = new ApplicationProviderMock();
_loggerFacade = new EmptyLogger();
}
}
El constructor se copió de PageNavigationServiceFixture. Ahora necesito implementar la prueba AProposCommand y tengo 2 preguntas (indicadas en el código)
¿Cómo inicializar el simulacro de servicio de navegación para que esté replicando mi aplicación? Para obtener información, aquí está mi clase de aplicación:
public partial class App : PrismApplication
{
public App(IPlatformInitializer initializer = null) : base(initializer) { }
protected override void OnInitialized()
{
InitializeComponent();
NavigationService.NavigateAsync("MenuPrincipalPage/ContenuPage/ClubHousePage");
}
protected override void RegisterTypes()
{
Container.RegisterTypeForNavigation<MenuPrincipalPage>();
Container.RegisterTypeForNavigation<ClubHousePage>();
Container.RegisterTypeForNavigation<AProposPage>();
Container.RegisterTypeForNavigation<ContenuPage>();
}
}
MenuPrincipalPage es una MasterDetailPage y ContenuPage es una NavigationPage.
Mi segunda pregunta es: cómo afirmar que la pila de navegación es ahoraMenuPrincipalPage / ContenuPage / ClubHousePage ?
¡Muchas gracias por leerlo todo y por sus respuestas!
Julien