Получение ошибки как «Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся» после выполнения модульного теста - PullRequest
0 голосов
/ 19 февраля 2019

Ниже приведен код, который перемещается с одной страницы на другую с помощью службы навигации в формах Xamarin.При нажатии на кнопку «Наблюдение» выполняется команда ObservationsCommand, как показано ниже.

public Command ObservationsCommand => new Command(async () => await OnObservationsCommandAsync());

После нажатия на кнопку «Наблюдение» она переходит на следующую страницу, передавая выбранные данные в службу навигации, как показано

private async Task OnObservationsCommandAsync()
            {
                ObservationDetailsParameter selectedData = new ObservationDetailsParameter
                {
                    Cage = DisplayedCage,
                    Dossiers = DossierList.SelectedItems
                };
                await _navigationService.NavigateToAsync<ObservationDetailsViewModel>(selectedData);
            }

Ниже приведен код для модульного теста

 [Fact]
    public void TestOnObservationsCommandAsync()
    {
        var mockNavigationService = new Mock<INavigationService>();
        var mockCageDetailsService = new MockCageDetailsService();
        var mockObservationDetailsService = new MockObservationDetailsService();
        var mockSettingsService = new MockSettingsService();
        Cage _displayedCage = new Cage { Id = 11 };
        Dossier _dossier1 = new Dossier { Id = 841 };
        var _dossierList = new SelectableItemCollection<Dossier>
        {
            _dossier1
        };
        _dossierList.SelectAll();
        var cageObsViewModel = new CageObsViewModel(mockNavigationService.Object, mockCageDetailsService, mockSettingsService);
        var mockObservationDetailsParameter = new 
Mock<IObservationDetailsParameter>();

        mockObservationDetailsParameter.Setup(x => 
x.Cage).Returns(_displayedCage);
        mockObservationDetailsParameter.Setup(x => x.Dossiers 
).Returns(_dossierList.SelectedItems );

        cageObsViewModel.DisplayedCage = mockObservationDetailsParameter .Object .Cage ;
        cageObsViewModel.DossierList = _dossierList;

        // Act
        cageObsViewModel.ObservationsCommand.Execute(null);
        mockNavigationService.Verify((s) => s.NavigateToAsync<ObservationDetailsViewModel>(mockObservationDetailsParameter.Object));
    }

Однако после выполнения этого теста я получаю сообщение об ошибке «Ожидаемый вызов на макет хотя бы один раз, но никогда не выполнялся».Не могли бы вы помочь?

1 Ответ

0 голосов
/ 19 февраля 2019

Это пример модульного теста, который я должен проверить навигацию после успешного входа в систему.

[Fact]
        public async Task ValidCredentials()
        {
            //Mock login -> false
            var authenticationServiceMock = new Mock<IAuthenticationService>();
            authenticationServiceMock
                .Setup(s => s.Login(It.IsAny<string>(), It.IsAny<string>()))
                .Returns(Task.FromResult(true));

            LoginViewModel viewModel = new LoginViewModel(authenticationServiceMock.Object);

            await viewModel.InitializeAsync(null);

            viewModel.UserName.Value = "johann@mail.com";
            viewModel.Password.Value = "1234!Maaaa";

            viewModel.LoginCommand.Execute(null);

            navigationServiceMock.Verify((s) => s.NavigateToAsync<HomeViewModel>());
        }

Поскольку я использую AutoFac, и мой ViewModelBase получает экземпляр NavigationService, это мои настройки теста:

public LoginViewModelTests()
        {
            ContainerBuilder builder = new ContainerBuilder();

            navigationServiceMock = new Mock<INavigationService>();

            navigationServiceMock.SetReturnsDefault<Task>(Task.FromResult(0));

            builder.RegisterInstance<INavigationService>(navigationServiceMock.Object);

            ViewModelLocator.RegisterDependencies(builder);
        }

Если это не совсем ясно, дайте мне знать, и мы можем рассмотреть его, чтобы лучше адаптироваться к вашему делу.

...