2012-05-23 3 views
1

Тест EndToEnd моего приложения включает загрузку выпущенных рук вручную.Ошибка при передаче namespaceA.objectA в namespaceA.objectA

Во время тестирования я всегда следующие нагруженный: - NUnit ShadowCopy н отладочных сборок - Postbuildeventcopy сборок релиза №

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

дать немного контекста вот некоторые псевдо-код:

private HookingHelper globalhooker; 
private Tools.ISomething globalmockery; 


TestfixtureSetUp(){ 
    globalhooker = new globalhooker(); 
    globalhooker.Loadfrom("c:\postbuildcopy.dll"); 
    globalmockery = Mockrepository.Generate<Tools.ISomething>(); 
    globalhooker.SetViaReflection<Tools.ISomething>("nameofsomething", globalmockery); 
} 

У меня есть вспомогательный класс, который использует LoadFrom, чтобы получить статический внутри сборки. Прежде чем я позвоню, я должен ввести макет.

Этот макет создается с использованием теневой копии библиотеки инструментов в отладочной версии, так как nunit создает ее.

Загруженная библиотека - это версия выпуска, которая важна для меня, так как я хочу провести тестирование как можно ближе к реальной среде.

Когда я пытаюсь внедрить с помощью отражения я должен использовать FieldInfo SetValue(...) вызов выглядит примерно так:

public static void ReplaceFieldPublicStatic<T>(Type type, string fieldname, T obj) 
    { 
     FieldInfo field = AssemblyHelper.GetFieldInfoPublicStatic(type, fieldname); 
     field.SetValue((T)obj, obj); 
    } 

Somethimes Рефлексия работы и иногда мои типы не могут быть литыми друг в друга.

Ошибка: ArgumentException Сгенерировано FieldInfo SetValue(...).

Когда я выполняю исключение и исследую разницу между field.FieldType != typeof(T), только вызов GetHashCode() дает другое значение.

Я думаю, что есть немного случайности.

Могу ли я заставить Typecast? Это даже разумно?

Есть ли что-то, что мне нужно делать во время сборки моих проектов, которые мне не хватает?

+2

Сколько сборок такого типа? Тип определяется его сборкой –

+0

debug/mydll.dll и relese/mydll.dll загружаются – Johannes

+0

, почему вы загружаете оба? –

ответ

0

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

Да - если два типа исходят от двух разных объектов Assembly, они относятся к CLR по-разному. Сборка могла быть загружена из одних и тех же байтовых последовательностей, но они все еще представляют собой отдельные сборки.

В основном вам нужно выбрать один Assembly использовать для каждого типа.

+0

А, я нашел причину случайности. когда я запускаю все тесты, это терпит неудачу, потому что порядок загрузки отличается. Когда я выбираю только определенный набор, порядок загрузки работает jsut fine ... так что это правильный ответ ... я буду принимать его, как только закончится 5 минут :) – Johannes

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