Я учусь писать модульные тесты для приложений 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;
}
}
Спасибо !!