MvvmCross中的导航单元测试

问题描述 投票:0回答:1

试图在我的一个命令调用中对导航进行单元测试,以进入私有方法。仅尝试测试此命令执行是否导致了导航请求。

有旧的文档;https://www.mvvmcross.com/documentation/fundamentals/testing

据我所知,本文档并未考虑基于异步的新调用;例如IMvxMainThreadAsyncDispatcher我们要么需要实现两个ExecuteOnMainThreadAsync方法,要么需要从MockDispatcher中的MvxMainThreadAsyncDispatcher继承。

还需要在IoC注册中添加IMvxMainThreadAsyncDispatcher。

var mockDispatcher = new MockDispatcher();

...

...

Ioc.RegisterSingleton<IMvxMainThreadAsyncDispatcher>(MockDispatcher);

因此,除了导航呼叫请求之外,几乎所有测试都可以工作。 MockDispatcher内部的以下方法永远不会被调用,因此我无法检查请求计数;

public async Task<bool> ShowViewModel(MvxViewModelRequest request)
{
     Requests.Add(request);
     return true;
}

任何人都有可以模拟的工作代码,并以其他形式调用此请求?已将IMvxMainThreadDispatcher设置为绝对,并且在MVVMCross中不再使用ShowViewModel <>()完成导航调用,而是通过调用navigationService.Navigate();

完成
unit-testing xamarin.android xamarin.ios moq mvvmcross
1个回答
0
投票

[嗯,我已经找到了解决我问题的方法...正确模拟导航服务后,将调用ShowViewModel。我在MvvmCross自己的仓库中的GitHub上找到了一段代码,关于它们如何进行导航测试。我的下一个挑战是模拟目标viewModel,但这是单独的,下面的代码没有涵盖这一点。以前,我有一个非常基本的IMvxNavigationService模拟。

var mockLocator = new Mock<IMvxViewModelLocator>();
mockLocator.Setup(
                m => m.Load(It.IsAny<Type>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxNavigateEventArgs>())).Returns(() => new FakeViewModel());
mockLocator.Setup(
                m => m.Reload(It.IsAny<IMvxViewModel>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxBundle>(), It.IsAny<IMvxNavigateEventArgs>())).Returns(() => new FakeViewModel());

var mockCollection = new Mock<IMvxViewModelLocatorCollection>();
mockCollection.Setup(m => m.FindViewModelLocator(It.IsAny<MvxViewModelRequest>()))
                .Returns(() => mockLocator.Object);

Ioc.RegisterSingleton(mockLocator.Object);

var loader = new MvxViewModelLoader(mockCollection.Object);

_navigationService = new MvxNavigationService(null, loader)
{
      ViewDispatcher = MockDispatcher,
};
_navigationService.LoadRoutes(new[] { typeof(YourViewModelTestClass).Assembly });
Ioc.RegisterSingleton<IMvxNavigationService>(_navigationService);
© www.soinside.com 2019 - 2024. All rights reserved.