【问题标题】:Navigation Unit Testing in MvvmCrossMvvmCross 中的导航单元测试
【发布时间】:2020-03-04 14:01:05
【问题描述】:

尝试将我的一个命令调用中的导航单元测试到私有方法中。只是尝试测试是否已作为此命令执行的结果发出导航请求。

有旧文档; 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】:

    好吧,我已经找到了我的问题的解决方案... ShowViewModel 在导航服务被正确模拟时被调用。我在 GitHub 上从 MvvmCross 自己的 repo 中找到了一段关于他们如何进行导航测试的代码。我的下一个挑战是模拟目标视图模型,但这是单独的,下面的代码没有涵盖这一点。以前我有一个非常基本的 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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多