试图在我的一个命令调用中对导航进行单元测试,以进入私有方法。仅尝试测试此命令执行是否导致了导航请求。
有旧的文档;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();
完成[嗯,我已经找到了解决我问题的方法...正确模拟导航服务后,将调用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);