Environment.System.Environment.SpecialFolder.MyDocuments Отличается в Xamarin.UITest, чем в приложении - PullRequest
0 голосов
/ 18 октября 2019

У меня есть проект Xamarin Forms, ориентированный на iOS. Я пытаюсь написать Xamarin.UITests, которые зависят от наличия определенных файлов в папке / Documents на устройстве. При попытке чтения / записи файлов в нужную папку я нашел вот что.

string documentBasePath =System.Environment.GetFolderPath (System.Environment.SpecialFolder.MyDocuments);

  1. Результаты из фактического приложения:

"/ Пользователи / markwardell / Библиотека / Разработчик/ CoreSimulator / Устройство / 147FD387-FCAD-4E93-BFC7-4BC1572FF7D4 / данные / Контейнеры / данные / Применение / 13E0B91B-8C70-4139-B570-7431DDF5B5CA / Документы "

Результаты Xamarin.UITest:

"/ Users / markwardell /"

Очевидно, мне нужен способ получить тот же результат, что и 1 ..

Как получить результаты папки так же, как приложение в UITest?

1 Ответ

1 голос
/ 18 октября 2019

Проект UITest не имеет доступа к Xamarin.iOS SDK, который является SDK, который дает вам путь от реального приложения при развертывании на устройстве или симуляторе. Таким образом, пространство имен System в версии .NET / Mono Xamarin.iOS реализует некоторые вещи по-разному в зависимости от платформы, что необходимо в этом случае, так как путь к документам в iOS отличается от того, как в Android, чем в Windows,и т.д. Так вот почему пути разные.

Тем не менее, вы можете обойти это, используя метод бэкдора. См .: https://docs.microsoft.com/en-us/appcenter/test-cloud/uitest/working-with-backdoors

Это позволяет вам вызывать метод, реализованный в самом проекте iOS, тем самым используя Xamarin.iOS SDK в этом методе.

Вы внедряете метод backdoor в AppDelegate class в своем проекте приложения для iOS следующим образом:

    [Export("getMyDocumentsPath:")] // notice the colon at the end of the method name
    public NSString GetMyDocumentsPath(NSString value)
    {
        // In through the backdoor - do some work.
        return new NSString(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments));
    }

Затем вызываете его из вашего проекта UI Test:

var path = app.Invoke("getMyDocumentsPath:", "").ToString();

Стоит отметить из связанного документа (на случай, если он вообще исчезнет):

В iOS IApp.Invoke может вызывать метод C # в AppDelegate проекта в соответствии со следующими правилами:

  • Метод должен быть общедоступным.
  • Метод должен быть украшен атрибутом ExportAttribute и идентифицировано имя открытого метода C #. Открытое имя должно добавить: (двоеточие) к имени. IApp.Invoke должен использовать форму iOS имени метода.
  • Метод должен принимать параметр NSString.
  • Метод должен возвращать NSString или void.
...