0

我目前正在 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:对于代码中随机的荷兰语单词/句子感到抱歉。这些只是视图组件的名称(如按钮名称)或我的应用程序在屏幕上提供的反馈。你可以忽略这些。

4

1 回答 1

0

点击发送电子邮件按钮app.Tap(c => c.Marked("btn_StuurMail_aid"));后,您应该有一些状态表明电子邮件是成功发送还是有错误。

在此状态下,您应该更新了一些 UI 元素。因此,您可以调用app.WaitForElementapp.WaitForNoElement让 UITest 等到您发送电子邮件的调用完成。

于 2017-10-24T23:37:51.540 回答