Тестирование Xunit для приложения Xamarin.Forms MVVMLight не работает должным образом и никогда не останавливается - PullRequest
1 голос
/ 19 марта 2019

Я учусь писать модульные тесты для приложений Xamarin. У меня есть очень простое приложение для форм, созданное с использованием MVVMLight и ServiceLocator. У меня есть страница входа и модель LoginViewModel, которую я хочу проверить. Я создал тестовый проект Xunit для тестирования LoginViewModel. Во-первых, я создал проходной тест (Факт), который проверяет, работает тестовый проект или нет. Он работает нормально и проходит гладко.

После этого я написал другую теорию с InlineData для проверки функциональности моей команды входа в систему, и там происходит ошибка, и тест, написанный для команды входа в систему, никогда не останавливается и не проходит или не проходит тест.

Я упоминаю оба моих занятия ниже, если кто-нибудь может взглянуть и сказать мне, что я делаю неправильно?

 public class LoginViewModel : ViewModelBase
{
    /// <summary>
    /// Initializes a new instance of the <see cref="T:MVVMArchitecture.ViewModels.LoginViewModel"/> class.
    /// </summary>
    /// <param name="navigation"> Navigation </param>
    /// <param name="dialog"> Dialog</param>
    public LoginViewModel(INavigationService navigation, IDialogService dialog) : base(navigation, dialog)
    {
        Title = PageTitles.LoginTitle;
        Validator = new UserValidator();
        ValidationContext = new ValidationContext<User>(User, new PropertyChain(), new RulesetValidatorSelector(new[] { "Login", "Password" }));
    }

    #region Properties
    User user = new User();

    public User User
    {
        get => user;
        set { SetProperty(ref user, value); }
    }

    RelayCommand loginCommand;

    public RelayCommand LoginCommand
    {
        get => loginCommand ?? (loginCommand = new RelayCommand(LoginUser, () => !IsBusy));
    }

    #endregion

    #region Action Hanlders
    async void LoginUser()
    {
        if (IsBusy)
            return;
        IsBusy = true;
        LoginCommand.RaiseCanExecuteChanged();

        var validationResults = Validator.Validate(ValidationContext);
        if (validationResults.IsValid)
        {
            var loggedIn = await LoginFlow();
            if (loggedIn)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    var navPage = new NavigationPage(new HomePage())
                    {
                        BarBackgroundColor = (Color)Application.Current.Resources["AppThemeColor"],
                        BarTextColor = Color.White
                    };
                    App.ConfigureMainPage(navPage);
                });
            }
            else
            {
                IsBusy = false;
                await DialogService.ShowMessage(AuthenticationAlerts.InvalidCredentials, AuthenticationAlerts.LoginFailed);
            }
        }
        else
        {
            IsBusy = false;
            await DialogService.ShowMessage(validationResults.Errors[0].ErrorMessage, AuthenticationAlerts.LoginFailed);
        }

        IsBusy = false;
        LoginCommand.RaiseCanExecuteChanged();
    }

    /// <summary>
    /// Login flow to login user based on internet and service mode.
    /// </summary>
    /// <returns>The flow.</returns>
    async Task<bool> LoginFlow()
    {
        return await Task.Run(async () => CommonUtils.Instance.IsConnected ? await ServiceManager.Instance.LoginUser(User) : await DataManager.Instance.LoginUser(User));
    }

    #endregion

    // sample method call from code behind
    public void DisplayData(string msg)
    {
        DialogService?.ShowMessageBox(msg, AppConstants.LoginPage);
    }
}

И мой тестовый класс:

public class UnitTest1
{
    App app;
    LoginViewModel loginViewModel;

    public UnitTest1()
    {
        Models.TestingMocks.Init();
        app = new App();
        loginViewModel = new LoginViewModel(ServiceLocator.Current.GetInstance<INavigationService>(),
            ServiceLocator.Current.GetInstance<IDialogService>());
    }

    [Fact]
    public void MustPass()
    {
        int expected = 1;
        int actual = 1;
        Assert.Equal(expected, actual);
        Assert.NotNull(app);
        Assert.NotNull(loginViewModel);
    }

    [Theory]
    [InlineData("ACosta", "Time2Eat!")]
    public void EmptyUsernamePassword(string username, string password)
    {
        var model = CreateViewModelAndLogin(username, password);
        //var v = ServiceManager.Instance.LoginUser(model.User);
        //A.CallTo(() => v.Result).MustHaveHappened();
        Assert.NotNull(model);
    }

    private LoginViewModel CreateViewModelAndLogin(string userName, string password)
    {
        loginViewModel.User = new User
        {
            UserName = userName,
            Password = password
        };

        loginViewModel.LoginCommand.Execute(null);

        return loginViewModel;
    }

}

Спасибо !!

...