Использование отражения, вызывающего MissingMethodException в Xamarin UITest

У меня есть класс в моем Xamarin PCL, который вызывает System.Reflection.GetRuntimeProperties. Например, предположим, что мой класс PCL имеет этот метод:

public string ExampleMethod(string arg) {
    if(arg == null) return null;
    IEnumerable<PropertyInfo> infos = this.GetType().GetRuntimeProperties();
    return infos[0].Name;
}

Затем у меня есть проект Xamarin.UITest, который ссылается на проект PCL и тестирует этот класс. На данный момент у меня есть два тестовых случая в моем TestFixture, которые для нашего примера будут следующими:

    [Test]
    public void TestExampleMethod_ArgNull_Null(){
        Assert.That (exampleInstance.ExampleMethod(null), Is.Null);
    } 

    [Test]
    public void TestExampleMethod_ArgNotNull_NotNull(){
        Assert.That (exampleInstance.ExampleMethod("testValue"), Is.NotNull);
    } 

Когда я запускаю проект Xamarin.UITest, он компилируется, выполняет тесты и завершается нормально на платформах Android и iOS. Тест TestExampleMethod_ArgNull_Null проходит успешно, так как он возвращается раньше. Однако тест TestExampleMethod_ArgNotNull_NotNull завершается с ошибкой:

System.MissingMethodException: метод «RuntimeReflectionExtensions.GetRuntimeProperties» не найден.

Итак, похоже, что хотя все компилируется просто отлично, и я могу нормально запускать другие тестовые примеры, проект Xamarin.UITest не может ничего использовать в System.Reflection. Кто-нибудь знает, как мне отладить это?


person thedigitalsean    schedule 22.07.2015    source источник


Ответы (2)


С моей стороны, использование следующего не удалось построить:

IEnumerable<PropertyInfo> infos = this.GetType().GetRuntimeProperties();
return infos[0].Name;

из-за невозможности делать скобочные индексы и IEnumerable. Я изменил на это:

List<PropertyInfo> infos = this.GetType().GetRuntimeProperties().ToList();
return infos[0].Name;

И проект построили, и испытания прошли успешно.

Класс с методом, использующим Reflection, находился в PCL, на который ссылались из проекта UI Test.

Так что в принципе я не могу воспроизвести ошибку, которую вы получили.

person jgoldberger - MSFT    schedule 22.07.2015
comment
Я думаю, что ОП имеет в виду этот метод расширения: msdn.microsoft.com/en-us/library/ - person thumbmunkeys; 28.07.2015

Я также отправил это в службу поддержки Xamarin (спасибо @jgoldberger), и мы смогли выяснить, что это связано с проблемой настройки проекта. Это проект, в котором используется Couchbase Lite, для которого требуется определенная версия Json.Net (6.0.4 на момент публикации). Должно быть, я случайно обновил пакеты в некоторых проектах, поскольку одна и та же версия Json.Net не использовалась во всех проектах (PCL, Android, iOS и UITest). В итоге я воссоздал проект с нуля, и на этом все закончилось.

person thedigitalsean    schedule 28.07.2015