【问题标题】:Unit Testing Unity Configuration File "The type name or alias xxxx could not be resolved"单元测试 Unity 配置文件“无法解析类型名称或别名 xxxx”
【发布时间】:2015-02-09 20:34:43
【问题描述】:

我想要一个简单的单元测试来验证我的统一配置 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 在执行应用程序时起作用。

我已经引用了Test项目中的所有程序集

我得到了这个异常

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 个类(非常小的程序集)

【问题讨论】:

  • 因为如果您不使用程序集中的类型,则不需要从程序集开始 - 因此它不会被复制到测试的 bin/也不会加载到您的进程中。您应该能够调试测试并查看模块列表/加载它们的位置,以确认您的程序集在第二种情况下不存在。将其添加为依赖项或复制 local=true 是另一个修复选项。
  • 我将它作为程序集引用,它是 Copy Local = True。 “将其添加为依赖项”是什么意思?那不是把它包含在项目的“参考”中吗?
  • 作为依赖项,我的意思是 [DeploymentItem("Some.Dll")],错误的词 - 抱歉...如果它已经设置为“CopyLocal=true”,它应该工作...作为第一步,您应该查看执行测试时程序集是否真的复制到正确的位置。
  • 旁注:考虑添加统一配置的相关部分 - 希望有人能够提供更好的指导。
  • 我认为 Unity 配置无关紧要。它可以在应用程序中使用,并且可以与那行代码一起使用,对统一配置没有任何更改。

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


【解决方案1】:

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

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

查看此 SO 了解更多详情 TFS not deploying referenced assembly to test dir when on build server

您必须在程序集中引用某些内容(类似于我上面的技巧

获取所有 dll:

[DeploymentItem(@".")]

或者获取一个 dll:

[DeploymentItem(@"YourAssembly.dll")]

注意:您会收到一些“进程无法访问文件”错误,但不要担心它会复制未使用的错误。 (这就是问题所在!)

【讨论】:

  • 很高兴看到你解决了它......(我什至在其他线程中也有错误的建议 - 从现在开始我会记住 MSTest 的奇怪行为:))
  • 只有复制本地的东西是错的,你说的其他一切都是真的。 :)
猜你喜欢
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2018-02-06
  • 1970-01-01
  • 2020-03-31
  • 1970-01-01
相关资源
最近更新 更多