Я тестирую некоторый код, который работает всякий раз, когда сборки загружаются в appdomain. Для модульного тестирования (в встроенном тестовом хосте VS2k8 в) Я раскручивается новый, однозначно названием AppDomain перед каждым испытанием с идеей, что он должен быть «чистым»:Ассембли таинственно загружены в новые AppDomains
[TestInitialize()]
public void CalledBeforeEachTestMethod()
{
AppDomainSetup appSetup = new AppDomainSetup();
appSetup.ApplicationBase = @"G:\<ProjectDir>\bin\Debug";
Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
Evidence evidence = new Evidence(baseEvidence);
_testAppDomain = AppDomain.CreateDomain("myAppDomain" + _appDomainCounter++, evidence, appSetup);
}
[TestMethod]
public void MissingFactoryCausesAppDomainUnload()
{
SupportingClass supportClassObj = (SupportingClass)_testAppDomain.CreateInstanceAndUnwrap(
GetType().Assembly.GetName().Name,
typeof(SupportingClass).FullName);
try
{
supportClassObj.LoadMissingRegistrationAssembly();
Assert.Fail("Should have nuked the app domain");
}
catch(AppDomainUnloadedException) { }
}
[TestMethod]
public void InvalidFactoryMethodCausesAppDomainUnload()
{
SupportingClass supportClassObj = (SupportingClass)_testAppDomain.CreateInstanceAndUnwrap(
GetType().Assembly.GetName().Name,
typeof(SupportingClass).FullName);
try
{
supportClassObj.LoadInvalidFactoriesAssembly();
Assert.Fail("Should have nuked the app domain");
}
catch(AppDomainUnloadedException) { }
}
public class SupportingClass : MarshalByRefObject
{
public void LoadMissingRegistrationAssembly()
{
MissingRegistration.Main();
}
public void LoadInvalidFactoriesAssembly()
{
InvalidFactories.Main();
}
}
Если каждый тест выполняется индивидуально Я считаю, что он работает правильно; appdomain создается и загружается только несколько запланированных сборок. Однако, если несколько тестов выполняются последовательно, то каждый _testAppDomain уже имеет сборки, загруженные из всех предыдущих тестов. Как ни странно, два теста получают приложения с разными именами. Тестовые сборки, которые определяют MissingRegistration и InvalidFactories (две разные сборки), никогда не загружаются в приложение apponain по умолчанию для модульного теста. Может ли кто-нибудь объяснить это поведение?
Обновление: Это как-то связано с appSetup.ApplicationBase. Использование другого пути для каждого прогона позволит избежать нежелательных побочных эффектов. – Eric
Update2: Проблема не повторяется, если одни и те же методы запускаются в том же порядке в консольном приложении. Возможно, тестовый узел VS вызывает некоторые проблемы. – Eric