我目前正在 Xamarin.Forms 中开发适用于 iOS 和 Android 的应用程序。我正在 Windows 10 上的 Visual Studio 2017 中处理这个项目。这个应用程序在它的 PCL 中有一个 UI(视图),其标记主要在 XAML 中。此视图(称为 LoginPage.xaml/LoginPage.xaml.cs)非常适合为其编写 UITest,作为实习生,我想至少编写一些 UITest。
所以为了做到这一点,我在解决方案中添加了一个 UITest 项目。我在这个项目中添加了 NuGet NUnit2.6.4,NuGet NUnit2TestAdapter(因为根据 Xamarins 文档版本 3 及更高版本的这些 NuGet 包不受 Xamarin.UITests 的支持。)而且由于我没有 Mac,我只能在Android 设备,这意味着我必须安装适当的 Android SDK 和 Java SDK。万岁,测试本身有效。
下一步是将 AutomationId 添加到 View 的组件中(所以我给所有按钮、标签、视图等添加了 AutomationId)。我做到了。我什至有一个非常简单的测试:
[Test]
public void ShouldShowMessageOnInvalidInsertedEmailadress()
{
app.WaitForElement(v => v.Marked("btn_StuurMail_aid").Text("Stuur me een e-mail"));
app.EnterText(c => c.Marked("entry_Emailadres_aid"), "a wrong emailadres");
app.DismissKeyboard();
app.Tap(c => c.Marked("btn_StuurMail_aid"));
app.WaitForElement(c => c.Marked("lbl_Error_aid").Text("Dat is geen geldige e-mailadres"));
}
这个 UITest 正是我想要的。注意代码 app.Tap(button)。已分配给此按钮的事件处理程序被点击。这导致事件处理程序中的代码被执行。事件处理程序检查插入的电子邮件地址是否有效,在这种情况下它不是有效的,因此它将反馈发送到视图。这包括将标签文本设置为“我们无法向您发送电子邮件...”。此更改发生在 C# 代码而不是 XAML 中,因为它在运行时发生更改。到目前为止,一切都像魅力一样运作。
现在变得棘手了。我在同一个项目(UITest)的同一个文件(Test.cs)中做了一个新的测试。现在,当我输入有效的电子邮件地址并点击相同的按钮时,如下所示:
[Test]
public void test()
{
app.WaitForElement(v => v.Marked("btn_StuurMail_aid").Text("Stuur me een e-mail"));
app.EnterText(c => c.Marked("entry_Emailadres_aid"), "johnsnow@outlook.com");
app.DismissKeyboard();
app.Tap(c => c.Marked("btn_StuurMail_aid"));
}
相同的代码被触发。被点击的按钮的事件处理程序检查插入的电子邮件是否有效(格式化的电子邮件应该被格式化)。在这种情况下,它确实如此。这就是触发向给定电子邮件地址发送电子邮件的代码的原因。这是对 API 的调用。这意味着代码需要等待并且事件处理程序必须是异步的。事件处理程序的代码如下所示:
public async void OnSendMail(object sender, EventArgs args)
{
IsBusy = true;
lbl_Error.IsVisible = false;
if (InsertedEmailIsValid())
{
try
{
lbl_Mededeling.Text = "Je aanmelding wordt verwerkt.";
await repo.RegisterUserAsync(CreateOwnUser());
lbl_Mededeling.Text = "Er wordt een e-mail verstuurd naar het door jou opgegeven e-mailadres";
await repo.SendMail();
lbl_VerwijzingMail.IsVisible = true;
btn_Activeer.IsVisible = true;
lbl_Mededeling.Text = "Er is een mail verstuurd naar " + inputEmail;
entry_Emailadres.IsVisible = false;
btn_StuurMail.IsVisible = false;
IsBusy = false;
}
catch (Exception ex)
{
lbl_Mededeling.Text = "Geef ter activatie een geldig e-mailadres op.";
lbl_Error.Text = "Deze app is niet toegankelijk voor medewerkers van de organisatie waar " +
"het-emailadres bij hoort.";
lbl_Error.IsVisible = true;
IsBusy = false;
}
}
else
{
lbl_Error.IsVisible = true;
IsBusy = false;
}
}
repo 是一个类,它进行实际的 API 调用以注册并向给定的电子邮件地址发送电子邮件。这些方法的返回类型为 Task 并且也是异步的(因为它们又需要等待 API 响应)。
这就是问题发生的地方。现在 UITest 中的代码触发了多个需要等待的方法调用,当 UITest 不再点击按钮时,UI 似乎不再执行代码。当我调试 UITest 或在 Release 和 Debug 中运行应用程序本身时,相同的代码可以正常工作并且符合预期。
有人可以帮我吗?
PS:对于代码中随机的荷兰语单词/句子感到抱歉。这些只是视图组件的名称(如按钮名称)或我的应用程序在屏幕上提供的反馈。你可以忽略这些。