BackDoor для форм Xamarin (Android)

Я создал приложение с помощью форм Xamarin (Android). Я создал тестовый проект xamarin ui ( Xamarin.UiTest = 1.3.7). Мне нужно использовать черный ход. Это мой код:

public class MainActivity : FormsApplicationActivity
{  
       ....
  [Java.Interop.Export("Test")]
  public void Test()  { }
}

это метод вызова в модульном тесте

app.Invoke("Test");

Я получаю это исключение:

 20-04-2016 12:02:36.805 +03:00 - 72182 - Error while performing Invoke("Test", null)
 Exception: System.Exception: Invoke for StartActivityTwo failed with outcome: ERROR
 No such method found: Test()
 in Xamarin.UITest.Android.AndroidGestures.Invoke(String methodName, Object[] arguments)
 in Xamarin.UITest.Utils.ErrorReporting.With[T](Func`1 func, Object[] args, String memberName)

Для проекта Xamarin Android это код работы.

Как использовать метод бэкдора в тесте пользовательского интерфейса xamarin с проектом формы xamarin? Это мой тестовый проект на git.

1 ответ

Решение

Отлично работает в нашем Xamarin.Forms решения, я бы дважды проверить, что вы экспортируете метод в MainActivity (который является единственным в Xamarin.Forms основанный на Android проект, в который вы можете добавить бэкдоры от Casbash) и делать Casbah WaitForElement чтобы убедиться, что основное действие выполняется до Backdoor вызов имеет место.

Быстрый тест с использованием Default/Template based Forms решение / проект.

В проекте Android (на основе Xamarin.Forms):

Дерево Repl:

[[object CalabashRootView] > PhoneWindow$DecorView]
  [ActionBarOverlayLayout] id: "decor_content_parent"
    [FrameLayout > ... > LabelRenderer] id: "content"
      [FormsTextView] text: "Welcome to Xamarin Forms!"

В пределах MainActivity учебный класс:

[Activity (Label = "UITestBackDoorForms.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity

Бэкдор Экспортированный Метод:

    [Export("MyBackdoorMethod")]
    public void MyBackdoorMethod()
    {
        System.Diagnostics.Debug.WriteLine("In through the backdoor - do some work");
    }

В тестовом проекте:

[Test]
public void InvokeBackdoor()
{
    // Wait for the Activity to load
    app.WaitForElement(c => c.Marked("decor_content_parent"));

    // Invoke the backdoor method MainActivity.MyBackDoorMethod
    app.Invoke("MyBackdoorMethod");
}

Выход LogCat:

I/System.out( 5754): params: {json={"query":"* marked:'decor_content_parent'","operation":{"method_name":"query","arguments":[]}}
I/System.out( 5754): }
~~~
I/System.out( 5754): URI: /backdoor
I/System.out( 5754): params: {json={"method_name":"MyBackdoorMethod","arguments":[]}
I/System.out( 5754): }
~~~
I/mono-stdout( 5754): In through the backdoor - do some work

Агент Xamarin Test Cloud попытается найти метод в следующем порядке:

Backdoors

Ссылка: https://developer.xamarin.com/guides/testcloud/uitest/working-with/backdoors/

Агент Xamarin Test Cloud попытается найти метод в следующем порядке:

  • Подкласс Android.App.Application.
  • Текущая деятельность.
  • Контекст корневого представления.

Обновление (предоставленный пользователем код):

Тестовый код перед:

[Test]
public void AppLaunches()
{
    app.Repl();
    //app.Screenshot("First screen.");
    //Assert.IsTrue(true);
    app.WaitForElement(c => c.Marked("action_bar_overlay_layout"));
    app.Invoke("Test");
}

Repl Output:

>>> tree                                                                        
[[object CalabashRootView] > PhoneWindow$DecorView]                             
  [ActionBarOverlayLayout] id: "decor_content_parent"
    [FrameLayout > ... > Platform_DefaultRenderer] id: "content"
      [ButtonRenderer]
        [Button] text: "Test1"
      [ButtonRenderer]
        [Button] text: "Test2"
      [ButtonRenderer]
        [Button] text: "Test3"

Проблема:

1) Вы ожидаете элемент с именем "action_bar_overlay_layout", есть действие с именем "decor_content_parent", которого вы можете ждать. Я склонен использовать то, что показано через вывод верхнего уровня дерева Repl, проще всего сопоставить, а другие следовать.

2) Вы пытались вызвать метод, экспортированный как Test но в MainActivity.as это помечено как [Export("MyBackdoorMethod")],

Изменения кода после:

[Test]
public void AppLaunches()
{
    app.Repl();
    app.WaitForElement(c => c.Marked("decor_content_parent"));
    app.Invoke("MyBackdoorMethod");
}

Запустите тест снова и успешно, ваш отладочный вывод записывается в logcat,

Logcat:

I/mono-stdout( 8641): In through the backdoor - do some work
Другие вопросы по тегам