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