Создание экземпляра метода доступа класса
В настоящее время я пишу платформу модульного тестирования, которая в конечном итоге будет запускать стандартные модульные тесты, написанные в Visual Studio. В настоящее время фреймворк не работает корректно с аксессорами. Рассмотрим следующий метод испытаний:
[TestMethod()]
public void TestMethod()
{
ExampleMethods_Accessor target = null;
target = new ExampleMethods_Accessor();
target.SomeMethod();
}
В этом примере средство доступа было создано Visual Studio. Модульный тест прекрасно работает при запуске в среде модульного тестирования Visual Studio. Тем не менее, я хотел бы вызвать TestMethod() из моего фреймворка. На линии "target = new ExampleMethods_Accessor ()", возникает следующее исключение:
Инициализатор типа для " Proband.ExampleMethods_Accessor " бросил исключение.
Внутреннее исключение:
Не удалось загрузить файл или сборку: Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null...Есть ли у кого-нибудь идея о том, как платформа модульного тестирования Microsoft вызывает модульные тесты? Я думал, что это может быть связано с отсутствующим объектом TestContext. В моем случае это "ноль". Когда при запуске модульного теста в Visual Studio объект TestContext содержит много информации. Может быть, мне нужно правильно его инициализировать? Как его нужно инициализировать?
Спасибо за помощь., Христианин
Редактировать:
Я продолжал экспериментировать с тем, как работают аксессоры. Я использовал ILSpy, чтобы увидеть, какой код генерируется в Proband_Accessor.файл DLL. Оказывается, что инструкция, вызывающая исключение, такова:SomeClass_Accessor.m_privateType = new PrivateType("Probant, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Probant.SomeClass");
Я изменил свой модульный тестовый код должен быть таким (только для теста):
[TestMethod()]
[DeploymentItem("Proband.dll")]
public void SomeMethodTest()
{
ExampleMethods_Accessor target = null;
ExampleMethods c = null;
try
{
Assembly.Load("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); // this works fine
PrivateType tx = new PrivateType(typeof(ExampleMethods)); // this works fine as well (also without loading the assembly)
PrivateType t = new PrivateType("Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "Proband.ExampleMethods"); // this causes the exception
c = new ExampleMethods(); // this works fine
target = new ExampleMethods_Accessor(); // this causes the exception as well
}
catch (Exception ex)
{
Console.WriteLine();
}
int actual;
actual = target.SomeMethod();
}
Я совершенно не понимаю, почему "новый PrivateType ("Proband, Version....- не работает. У кого-нибудь есть идея?
3 ответа:
Мне удалось создать обходной путь для этой проблемы.
В мой домен приложений я добавляю AssemblyResolveEventHandler:
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Этот обработчик событий содержит следующий код:
private Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) { if(args.Name == "Proband, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") { // resolving correct assembly of type under test return typeof(ExampleMethods).Assembly; } else { return null; } }
Теперь строка кода "target = new ExampleMethods_Accessor ();" работает нормально и возвращает правильный объект accessor.
Я до сих пор не понимаю, почему собрание не может быть решено автоматически.Даже если очень маловероятно, что кто-то будет иметь то же самое проблема: я надеюсь, что этот ответ кому-то поможет:)
Я не делаю ничего почти столь же сложного, но у меня было:
- проект веб-приложения с использованием .NET 3.5
- Проект конфигурации с использованием .NET 3.5
- тестовый проект с использованием .NET 3.5
Я получал то же исключение BadImageFormat при попытке запустить модульный тест с помощью метода доступа.
Я нашел следующее ссылка:
Вторая обходная операция решила мою проблему. Я изменил тестовый проект на целевой .NET 4.0, и это сработало.
У меня только что была эта точная проблема, и это было потому, что я удалил атрибут
DeploymentItem
из метода тестирования. Как только я добавил его снова, я больше не получал ошибку на машине сборки.[TestMethod] [DeploymentItem("FedImportServer.dll")] // ** This is necessary for the build machine. ** public void SourceFileStillExistsAfterProcessingFails()
Примечание: Я никогда не получал ошибку при запуске его локально.
Это ошибка:
Test method FedImportTests.FedImportServiceHostTest.FileNoLongerExistsAfterSucessfulProcessing threw exception: System.TypeInitializationException: The type initializer for 'FedImportServer.Processing.FileProcessor_Accessor' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'FedImportServer, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified.