Je teste un code qui fonctionne lorsque des assemblys sont chargés dans un domaine d'application. Pour les tests unitaires (dans l'hôte de test intégré de VS2k8) je tourne une nouvelle, unique nommé appdomain avant chaque test avec l'idée qu'il devrait être « propre »:Assemblages mystérieusement chargés dans les nouveaux 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();
}
}
Si chaque test est exécuté individuellement Je trouve que cela fonctionne correctement; le domaine d'application est créé et ne contient que les quelques assemblages prévus. Toutefois, si plusieurs tests sont exécutés successivement, chaque _testAppDomain a déjà des assemblys chargés à partir de tous les tests précédents. Assez curieusement, les deux tests obtiennent des domaines d'application avec des noms différents. Les assemblys de test qui définissent MissingRegistration et InvalidFactories (deux assemblages différents) ne sont jamais chargés dans le domaine d'application par défaut du test unitaire. Quelqu'un peut-il expliquer ce comportement?
Mise à jour: Cela a quelque chose à voir avec appSetup.ApplicationBase. L'utilisation d'un chemin différent pour chaque exécution permettra d'éviter les effets secondaires indésirables. – Eric
Update2: Le problème ne se reproduit pas si les mêmes méthodes sont exécutées dans le même ordre dans une application de console. Peut-être que l'hôte de test VS cause des problèmes. – Eric