使用后门程序
后门 程序是包含在 Xamarin.iOS 或 Xamarin.Android 应用中的方法,在测试运行期间调用这些方法以执行一些特殊操作,例如配置设备上的测试状态。 例如,可以使用后门为数据库设定一些测试数据种子,以便测试装置中的所有测试都可以一致地使用它。
IApp.Invoke允许测试调用应用中的后门方法。
如何在应用程序中使用和实现后门方法在 iOS 和 Invoke Android 之间有所不同。
Android 上的 IApp.Invoke
在 Android IApp.Invoke 上, 可用于根据以下规则调用 Xamarin.Android 应用程序中的方法:
- 方法必须为
public。 - 必须使用公开后门方法名称的属性修饰
Java.Interop.Export后门方法。 - 方法可能返回 、
stringJava.Lang.String或 之一void。 - 方法可以接受 参数,该参数可能是 、
stringint或bool。 - 如果方法接受 参数,则必须将参数提供给
IApp.Invoke。
Xamarin Test Cloud代理将尝试按以下顺序查找 方法:
- 子
Android.App.Application类。 - 当前活动。
- 根视图的上下文。
以下代码是如何在活动中创建后门方法的代码片段:
[Activity(Label = "@string/activity_main", MainLauncher = true)]
public class MainActivity : Activity
{
[Export("MyBackdoorMethod")]
public void MyBackdoorMethod()
{
// In through the backdoor - do some work.
}
}
若要调用此方法,请首先等待 Activity 加载,然后以字符串形式传递方法的名称 Invoke ,如以下代码片段所示:
[TestFixture]
public class InvokeExampleTestFixture()
{
[Test]
public void InvokeTest()
{
// Wait for the Activity to load
app.WaitForElement(c => c.Marked("action_bar_title").Text("Enter Credit Card Number"));
// Invoke the backdoor method MainActivity.MyBackDoorMethod
app.Invoke("MyBackdoorMethod");
}
}
备注
可能需要向 Xamarin 项目中的 Mono.Android.Export.dll 程序集添加引用。
IOS 上的 IApp
在 iOS 上, IApp.Invoke 可以根据以下规则对项目的 AppDelegate 调用 c # 方法:
- 方法必须是
public。 - 此方法必须与标识的已
ExportAttribute公开 c # 方法的和名称一起进行装饰。 公开的名称必须将:(冒号) 添加到名称。IApp.Invoke必须使用方法名称的 iOS 形式。 - 此方法必须采用的参数
NSString。 - 方法必须返回
NSString或无效。
下面的代码代码段显示了如何在 iOS 中声明后门方法:
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
[Export("myBackdoorMethod:")] // notice the colon at the end of the method name
public NSString MyBackdoorMethod(NSString value)
{
// In through the backdoor - do some work.
}
}
若要调用此方法,请向 Invoke 方法传递中指定的方法的名称 ExportAttribute ,如以下代码片段所示:
[TestFixture]
public class InvokeExampleTestFixture()
{
[Test]
public void InvokeTest()
{
// Wait for the ViewController to appear.
app.WaitForElement(c=>c.Class("UINavigationBar").Marked("Simple Credit Card Validator"));
// Now invoke the backdoor.
app.Invoke("myBackdoorMethod:", "the value");
}
}