Модульное тестирование - Призма - Xamarin.Forms - Проблема с INavigationService - PullRequest
0 голосов
/ 28 января 2019

Я недавно начал работать над приложением Xamarin.Forms для iOS и Android.Я добавил проект модульного тестирования с пакетами xUnit.

На данный момент приложение имеет один вид и одну модель представления.Я хотел все связать.таким образом, у модели представления есть только одно свойство.свойство инициализируется в string.empty.Так что я просто проверяю, чтобы убедиться, что это не ноль.Viewmodel зависит от NagivationService.

в моем App.xaml.cs - view и viewmodel зарегистрированы для навигации.

protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
    containerRegistry.RegisterForNavigation<NavigationPage>();
    containerRegistry.RegisterForNavigation<ViewAPage, ViewAPageViewModel>();
}

Я создал макет приложения

public class AppMock : App
{
    public AppMock(IPlatformInitializer initializer)
        : base(initializer) {}

    // Added as a work around
    public new INavigationService NavigationService => base.NavigationService;

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        base.RegisterTypes(containerRegistry);
        containerRegistry.Register<ILoggerFacade, XunitTestOutputLogger>();
    }
}

Тестовое устройство

public class ViewAViewModelFixture : FixtureBase, IDisposable
{
    public ViewAViewModelFixture(ITestOutputHelper testOutputHelper)
        : base(testOutputHelper) {
    }

    private AppMock CreateApp()
    {
        var initializer = new XunitPlatformInitializer(_testOutputHelper);
        return new AppMock(initializer);
    }

    protected AppMock App
    {
        get
        {
            if ( app == null )
            {
                this.App = CreateApp();
            }
            return this.app;
        }
        set
        {
            this.app = value;
        }
    }
    private AppMock app;

    [Fact]
    public void Email_IsEmpty()
    {            
        ViewAViewModel vm = (ViewAViewModel)this.App.Container.Resolve(typeof(ViewAViewModel));

        string email = vm.Email;

        Assert.Equal(expected: string.Empty, actual: email);
    }

    public void Dispose()
    {
        PageNavigationRegistry.ClearRegistrationCache();
    }
}

Когда я пытаюсь выполнить вышеуказанный тест, я получаю следующую ошибку:

Message: Unity.Exceptions.ResolutionFailedException : Resolution of the dependency failed, type = 'App.ViewModels.ViewAViewModel', name = '(none)'.
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Prism.Navigation.INavigationService, is an interface and cannot be constructed. Are you missing a type mapping?

Я не уверен, что мне не хватает,Когда я запускаю приложение локально в эмуляторе Android или iOS, оно работает нормально.поэтому я попробовал следующее:

[Fact]
public void Email_IsEmpty()
{
    var app = this.App;
    var NavService = app.NavigationService;

    NavService.NavigateAsync("/ViewA");

    ViewA view = (ViewA)this.App.MainPage;

    Assert.IsType<ViewAViewModel>(view.BindingContext);
    ViewAViewModel vm = view.BindingContext as ViewAViewModel;

    string email = vm.Email;

    Assert.Equal(expected: string.Empty, actual: email);
}

этот тест пройден, а другой, очевидно, не пройден.

Кто-нибудь видит, чего мне не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...