【发布时间】:2010-12-14 07:20:54
【问题描述】:
我正在测试一些在程序集加载到应用程序域时可以工作的代码。对于单元测试(在 VS2k8 的内置测试主机中),我在每次测试之前启动了一个新的、唯一命名的 appdomain,并认为它应该是“干净的”:
[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 都已经从所有先前的测试中加载了程序集。奇怪的是,这两个测试得到了不同名称的 appdomains。定义 MissingRegistration 和 InvalidFactories(两个不同的程序集)的测试程序集永远不会加载到单元测试的默认应用程序域中。谁能解释这种行为?
【问题讨论】:
-
更新:它与 appSetup.ApplicationBase 有关。每次运行使用不同的路径将避免不良副作用。
-
Update2:如果在控制台应用程序中以相同的顺序运行相同的方法,则该问题不会再次出现。可能是 VS 测试主机引起了一些问题。
标签: assemblies mstest appdomain