Я пытаюсь написать тесты пользовательского интерфейса Xamarin.Forms, используя Moq, чтобы имитировать мой интерфейс аутентификации: [предыдущий вопрос] [1]. Я реорганизовал свое приложение, так что мой метод SignIn(string username, string password)
находится внутри класса, реализующего IAuthService
. Теперь у меня возникают проблемы с имитацией IAuthService
, чтобы по существу «заменить» фактическую проверку входа, которая происходит при нажатии кнопки Sign In
. В моем классе CloudAuthService
(который реализует IAuthService
) я выполняю аутентификацию в Amazon Cognito, но хочу имитировать этот результат в тесте пользовательского интерфейса, чтобы он не вызывал облачную службу.
EDIT: после многих предложений я решил включить мою текущую реализацию ниже. Это все еще не работает полностью, несмотря на то, что вывод Console.WriteLine(App.AuthApi.IsMockService());
в методе BeforeEachTest()
приводит к true
(как и ожидалось). Однако выполнение того же самого в методе конструктора App()
приводит к false
. Таким образом, кажется, что он не работает до того, как приложение действительно запустится, есть ли способ получить код UITest, который запускается до инициализации приложения?
Страница входа
[XamlCompilation(XamlCompilationOptions.Compile)]
public sealed partial class LoginPage
{
private readonly IBiometricAuthentication _bioInterface;
private static readonly Lazy<LoginPage>
Lazy =
new Lazy<LoginPage>
(() => new LoginPage(App.AuthApi));
public static LoginPage Instance => Lazy.Value;
private string _username;
private string _password;
private LoginPageViewModel _viewModel;
private IAuthService _authService;
public LoginPage(IAuthService authService)
{
InitializeComponent();
_authService = authService;
_viewModel = new LoginPageViewModel();
BindingContext = _viewModel;
}
private void LoginButtonClicked(object sender, EventArgs args)
{
_username = UsernameEntry.Text;
_password = PasswordEntry.Text;
LoginToApplication();
}
public async void LoginToApplication()
{
AuthenticationContext context = await _authService.SignIn(_username, _password);
}
}
Класс приложения
public partial class App
{
public static IAuthService AuthApi { get; set; } = new AWSCognito()
public App()
{
Console.WriteLine(AuthApi.IsMockService())
// AuthApi = new AWSCognito(); // AWSCognito implements IAuthService
InitializeComponent();
MainPage = new NavigationPage(new LoginPage(AuthApi));
}
}
Тестовый класс
class LoginPageTest
{
IApp app;
readonly Platform platform;
public LoginPageTest(Platform platform)
{
this.platform = platform;
}
[SetUp]
public void BeforeEachTest()
{
var mocker = new Mock<IAuthService>();
var response = new AuthenticationContext(CognitoResult.Ok)
{
IdToken = "SUCCESS_TOKEN"
};
mocker.Setup(x => x.SignIn(It.IsAny<string>(), It.IsAny<string>())).Returns(() => new MockAuthService().SignIn("a", "a"));
mocker.Setup(x => x.IsMockService()).Returns(() => new MockAuthService().IsMockService());
App.AuthApi = mocker.Object;
Console.WriteLine(App.AuthApi.IsMockService());
app = AppInitializer.StartApp(platform);
}
[Test]
public void ClickingLoginWithUsernameAndPasswordStartsLoading()
{
app.WaitForElement(c => c.Marked("Welcome"));
app.EnterText(c => c.Marked("Username"), new string('a', 1));
app.EnterText(c => c.Marked("Password"), new string('a', 1));
app.Tap("Login");
bool state = app.Query(c => c.Class("ProgressBar")).FirstOrDefault().Enabled;
Assert.IsTrue(state);
}
}
IAuthService
, чтобы приложение не вызывало службу Amazon Cognito. Я обновлю вопрос с полной тестовой реализацией. - person itcoder   schedule 14.01.2021app
должен получить свой_authService
член с помощью механизма, который позволяет его заменять. - person Aluan Haddad   schedule 14.01.2021LoginPage
так, чтобы он передавался экземпляруIAuthService
в той или иной форме, то теоретически я должен иметь возможность заменить эту службу с помощью издевательской службы? - person itcoder   schedule 14.01.2021public App()
не запускается в первую очередь? Или вы имеете в виду ввести его раньше с точки зрения теста? - person itcoder   schedule 15.01.2021