单元测试Unity配置文件“无法解析类型名称或别名xxxx”

时间:2015-02-09 20:34:44

标签: c# unit-testing dependency-injection unity-container mstest

我想要一个简单的单元测试来验证我的单位配置xml中的所有类型是否有效

[TestMethod]
[TestCategory("IntegrationTest")]
[DeploymentItem(@"..\..\..\App\Unity.config", @"MyApp")]
public void VerifyTypeNamesForMyAppUnityConfig()
{       
   var fileMap = new ExeConfigurationFileMap { 
      ExeConfigFilename = @"MyApp\Unity.config" 
   };
   var configuration = ConfigurationManager
       .OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
   var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");
   var container = new UnityContainer();

   container.LoadConfiguration(unitySection);
}

Unity.config在执行App时有效。

我引用了测试项目中的所有程序集

我得到了这个例外

Test Name:  VerifyTypeNamesForMyAppUnityConfig
Test FullName:  MyApp.Test.UnityTests.VerifyTypeNamesForMyAppUnityConfig
Test Source:    c:\SourceControl\MyAppMerge\MyApp.Test\UnityTests.cs : line 47
Test Outcome:   Failed
Test Duration:  0:00:00.5187389

Result Message: 
Test method MyApp.Test.UnityTests.VerifyTypeNamesForMyAppUnityConfig threw exception: 
System.InvalidOperationException: The type name or alias MyApp.Services.Attachments.AttachmentService, MyApp.Services.Attachments could not be resolved. Please check your configuration file and verify this type name.
Result StackTrace:  
at Microsoft.Practices.Unity.Configuration.ConfigurationHelpers.TypeResolverImpl.ResolveType(String typeNameOrAlias, Boolean throwIfResolveFails)
   at Microsoft.Practices.Unity.Configuration.RegisterElement.GetMappedType()
   at Microsoft.Practices.Unity.Configuration.RegisterElement.ConfigureContainer(IUnityContainer container)
   at Microsoft.Practices.Unity.Configuration.ContainerElement.<>c__DisplayClass1.<ConfigureContainer>b__0(ContainerConfiguringElement element)
   at Microsoft.Practices.ObjectBuilder2.EnumerableExtensions.ForEach[TItem](IEnumerable`1 sequence, Action`1 action)
   at Microsoft.Practices.Unity.Configuration.ContainerElement.ConfigureContainer(IUnityContainer container)
   at Microsoft.Practices.Unity.Configuration.UnityConfigurationSection.Configure(IUnityContainer container, String configuredContainerName)
   at Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer container, UnityConfigurationSection section, String containerName)
   at Microsoft.Practices.Unity.Configuration.UnityContainerExtensions.LoadConfiguration(IUnityContainer container, UnityConfigurationSection section)
   at MyApp.Test.UnityTests.VerifyTypeNamesForMyAppUnityConfig() in c:\SourceControl\MyAppMerge\MyApp.Test\UnityTests.cs:line 61

测试通过如果我进行此更改

var WTF = new List<AttachmentService>();
container.LoadConfiguration(unitySection);

但这次失败就像这样

//var WTF = new List<AttachmentService>();
container.LoadConfiguration(unitySection);

为什么?

我有数百个统一配置。大多数都有效。只有少数几个类需要这个小技巧。我不知道这些少数类/程序集有什么不同。唯一的相似之处是程序集中只有1到3个类(非常小的程序集)

1 个答案:

答案 0 :(得分:3)

我检查了TestResults文件夹(如Alexei建议的那样)并且它没有程序集!即使它设置为Copy Local = True。

看来MSTest使用反射来确定复制到TestResults文件夹的程序集。

有关详细信息,请参阅此SO TFS not deploying referenced assembly to test dir when on build server

你必须在程序集中引用一些东西(类似于上面的技巧

OR

获取所有的dll:

[DeploymentItem(@".")]

要获得一个dll:

[DeploymentItem(@"YourAssembly.dll")]

注意:您将获得一些&#34;该过程无法访问该文件&#34;错误,但不要担心它会复制未使用的错误。 (这是问题!)