2014-12-14 2 views
1

Я пытаюсь получить Xamarin Forms, работающий с UITest, и я не могу заставить свойство StyleId устанавливать в iOS (у меня нет лицензии для Android).Xamarin Forms не устанавливает StyleId для UITest

Я следовал всю документацию и эти шаги я взял до сих пор:

AppDelegate:

static readonly IntPtr setAccessibilityIdentifier_Handle = Selector.GetHandle("setAccessibilityIdentifier:"); 

public override bool FinishedLaunching(UIApplication app, NSDictionary options) 
{ 
    Forms.Init(); 

    Forms.ViewInitialized += (object sender, ViewInitializedEventArgs e) => { 
     // http://developer.xamarin.com/recipes/testcloud/set-accessibilityidentifier-ios/ 
     if (null != e.View.StyleId) { 
      e.NativeView.AccessibilityIdentifier = e.View.StyleId; 
      Console.WriteLine("Set AccessibilityIdentifier: " + e.View.StyleId); 
     } 
    }; 

    ... 

    #if DEBUG 
    Xamarin.Calabash.Start(); 
    #endif 

    ... 
} 

XAML ContentPage:

<?xml version="1.0" encoding="UTF-8"?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      x:Class="Ignite.Abacus.Mobile.OptionsView" 
      Title="Options"> 
    <ContentPage.Content> 
     <StackLayout> 
      <Label Text="Test" StyleId="Test" /> 
     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

Теперь, вот кикер:

Если я отлажу приложение, я могу cl начало см. StyleId получает набор, потому что вызов Console.WriteLine в обработчике Forms.ViewInitialized в AppDelegate записывает на выход приложения. Но если я отлаживаю модульный тест, который у меня есть и запрашивает его из REPL, он, похоже, не подключает свойство StyleId, потому что app.Query(c => c.Marked("Test")) возвращает нулевые результаты.

Я хотел бы видеть консольный вывод приложения при его запуске в области проверки - но он, кажется, ничего не выводит ни в окно вывода приложения, ни в окно результатов теста (с включенным выходом) ...

Любые идеи относительно того, чего я не хватает?

+0

Ба - это должен быть что-то с моим конкретным проектом - я могу получить UITest работать в новом проекте просто отлично, но у меня проблемы. Я просто перестрою файл проекта. –

ответ

1

Ah-HA! У меня было такое ощущение, что это было, когда я впервые начал эту проблему, но благодаря question asked here я смог узнать, что мне нужно сделать, чтобы решить эту проблему.

В принципе - я начал создавать модульные тесты с использованием UITest без каких-либо свойств StyleId - тогда я начал ретроактивно проходить и добавлять свойства StyleId к своим элементам. То, что происходило, было то, что iOS Simulator был кэшированием моего приложения и не использовал последнюю сборку. Я ВСЕГДА удалял папки bin/obj во всех моих проектах и ​​перестраивал их через Xamarin Studio, а NOTHING работал, поэтому я предположил, что это была система UITest после этого.

В связанном выше вопросе я заметил, что кто-то заметил, что вам нужно зайти в iOS Simulator и нажать «iOS Simulator -> Сбросить содержимое и настройки», а затем удалить мое кэшированное приложение. Я перестроился, и теперь все работает.

Это заставило меня встать на стену, потому что у нее ТОЛЬКО эта проблема возникла при запуске через окно «Тесты единиц измерения» в Xamarin Studio - если вы запускаете или отлаживаете приложение напрямую (не в области единичного тестирования), оно не кэширует приложение. Однако, если вы снова запустите приложение через окно «Тесты единиц», оно вернется и снова будет использовать кэшированное приложение.

Я должен посмотреть, могу ли я воспроизвести в простом проекте и создать ошибку.

+0

Подано в качестве ошибки с Xamarin [Bug 25374] (https://bugzilla.xamarin.com/show_bug.cgi? id = 25374) –

2

Иди в это сегодня; есть более простой обходной путь, чем вручную «Файл -> Reset Simulator» и это настроить [SetUp], чтобы сделать это за вас автоматически:

using System.Diagnostics; 

[SetUp] 
public override void SetUp() 
{ 
    const string simulatorId = "2261E5E1-758A-4967-8BF2-181E8099379F"; // iPhone 5s iOS 8.2 
    ResetSimulator(simulatorId); 

    // an API key is required to publish on Xamarin Test Cloud for remote, multi-device testing 
    app = ConfigureApp.iOS.AppBundle(PathToIPA).DeviceIdentifier(simulatorId).EnableLocalScreenshots().ApiKey(Constants.XamarinTestCloudApiKey).StartApp(); 
} 

public static void ResetSimulator(string deviceId) 
{ 
    var shutdownProcess = Process.Start("xcrun", string.Format("simctl shutdown {0}", deviceId)); 
    shutdownProcess.WaitForExit(); 
    var eraseProcess = Process.Start("xcrun", string.Format("simctl erase {0}", deviceId)); 
    eraseProcess.WaitForExit(); 
} 
+0

Очень приятное обходное решение - спасибо за обновление сообщения об ошибке, а также его –

Смежные вопросы