使用后门程序

后门 程序是包含在 Xamarin.iOS 或 Xamarin.Android 应用中的方法,在测试运行期间调用这些方法以执行一些特殊操作,例如配置设备上的测试状态。 例如,可以使用后门为数据库设定一些测试数据种子,以便测试装置中的所有测试都可以一致地使用它。

IApp.Invoke允许测试调用应用中的后门方法。

如何在应用程序中使用和实现后门方法在 iOS 和 Invoke Android 之间有所不同。

Android 上的 IApp.Invoke

在 Android IApp.Invoke 上, 可用于根据以下规则调用 Xamarin.Android 应用程序中的方法:

  • 方法必须为 public
  • 必须使用公开后门方法名称的属性修饰 Java.Interop.Export 后门方法。
  • 方法可能返回 、 string Java.Lang.String 或 之一 void
  • 方法可以接受 参数,该参数可能是 、 string intbool
  • 如果方法接受 参数,则必须将参数提供给 IApp.Invoke

Xamarin Test Cloud代理将尝试按以下顺序查找 方法:

  1. Android.App.Application 类。
  2. 当前活动。
  3. 根视图的上下文。

以下代码是如何在活动中创建后门方法的代码片段:

[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");
    }
}