В настоящее время я пишу фреймворк для модульных тестов, который в конце концов будет запускать стандартные модульные тесты, написанные в Visual Studio. Framework в настоящее время не работает правильно с аксессорами. Рассмотрим следующий метод испытаний:
[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, версия = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null ...
Кто-нибудь имеет представление о том, как Microsoft Unit Testing Framework вызывает модульные тесты? Я думал, что это может быть связано с отсутствующим объектом TestContext. Это «ноль» в моем случае. При запуске модульного теста в Visual Studio объект TestContext содержит много информации. Может быть, мне нужно правильно его инициализировать? Как его нужно инициализировать?
Спасибо за помощь,
Christian
EDIT:
Я продолжал экспериментировать с тем, как работают аксессоры. Я использовал 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 .... "не работает. У кого-нибудь есть идея?