Asp.net web api 测试项目扫描我的控制器两次
我已经为这个特定的帖子创建了一个github repo,可以在 我试图做的是为我的WebApi应用程序编写测试。在我的规格测试中我Asp.net web api 测试项目扫描我的控制器两次,asp.net-web-api,structuremap,nservicebus,specflow,fakeiteasy,Asp.net Web Api,Structuremap,Nservicebus,Specflow,Fakeiteasy,我已经为这个特定的帖子创建了一个github repo,可以在 我试图做的是为我的WebApi应用程序编写测试。在我的规格测试中我 创建HttpClient以使用WebApi 通过HttpClient调用我的WebApi 将结果序列化到列表中 确保已调用NServiceBus 所有这些都可以找到 我也在使用StructureMap,我猜它会扫描我的APIController。似乎NServiceBus也会扫描我的APIController,因为当我尝试运行测试时,会出现以下错误: Multipl
Multiple types were found that match the controller named 'values'. This can happen if the route that services this request ('api/{controller}/{id}') found multiple controllers defined with the same name but differing namespaces, which is not supported. The request for 'values' has found the following matching controllers: WebApiNServiceBus.Proj.Controllers.ValuesController WebApiNServiceBus.Proj.Controllers.ValuesController
要真正发现错误并不容易。我必须
http://localhost:81/ValService/api/values/assets
将只加载Configure.With(Enumerable.Empty<Assembly>());
Configure.With(Enumerable.Empty());
解决方案中的主要组件是WebApi、NServiceBus、StructureMap、FakeiTasy和SpecFlow
我卡住了。我怎样才能通过考试
编辑:也许解决方案是让WebApi不注册控制器——让NServiceBus决定吧?如何尝试此操作?这可能不是您想要的答案,但这些程序集已加载两次(只需使用
System.AppDomain.CurrentDomain.GetAssemblies()
):
当你真正看这个位置时,这里是它显示的:
System.AppDomain.CurrentDomain.GetAssemblies()[43].Location
"C:\\Users\\alik\\GitHub\\WebApiNServiceBus\\WebApiNServiceBus.Proj.Specs\\bin\\Debug\\WebApiNServiceBus.Proj.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[44].Location
"C:\\Users\\alik\\GitHub\\WebApiNServiceBus\\WebApiNServiceBus.Proj.Specs\\bin\\Debug\\WebApiNServiceBus.Proj.Specs.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[9].Location
"C:\\Users\\alik\\AppData\\Local\\Temp\\nfx3urho.nhb\\WebApiNServiceBus.Proj.Specs\\assembly\\dl3\\6d69b640\\baacb725_f5f7cd01\\WebApiNServiceBus.Proj.Specs.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[18].Location
"C:\\Users\\alik\\AppData\\Local\\Temp\\nfx3urho.nhb\\WebApiNServiceBus.Proj.Specs\\assembly\\dl3\\180be185\\4a3f842e_f3f7cd01\\WebApiNServiceBus.Proj.dll"
我认为这与单元测试的运行方式有关。更新:截止到,这不应该发生。如果需要,FakeiTesy将只扫描磁盘上的程序集。
我不知道StructureMap和NServiceBus是如何工作的,但幸运的是,就在今天早上,我发表了一篇关于的博客文章,我想这篇文章为您提供了一些答案
亮点:您看到的程序集副本以及使用System.AppDomain.CurrentDomain.GetAssemblies()
列出的@Aliostad都是卷影副本,几乎可以肯定是由ReSharper测试运行程序生成的。您可以指示跑步者不要复制这些副本
版本1.13之前的FakeiTesy将扫描应用程序域中的所有程序集和应用程序目录中的所有DLL-这将导致在启用卷影复制时加载重复的程序集
对于1.13,有两种优化。第一个是,如果程序集已经加载,那么如果位置匹配,它不会从文件系统重新加载它。不幸的是,卷影副本无法通过此检查
第二个优化可能对您有所帮助-FakeiTesy将从磁盘加载程序集,仅用于反射,如果程序集未引用FakeiTesy,则不会完全加载,也不会扫描其类型。由于应完全加载的程序集更少,因此可以避免重复类型问题
我建议你去买假货1.13。在打开和关闭卷影副本的情况下都可以尝试。见鬼,即使只关闭当前版本的卷影副本也会有所帮助
System.AppDomain.CurrentDomain.GetAssemblies()[43].Location
"C:\\Users\\alik\\GitHub\\WebApiNServiceBus\\WebApiNServiceBus.Proj.Specs\\bin\\Debug\\WebApiNServiceBus.Proj.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[44].Location
"C:\\Users\\alik\\GitHub\\WebApiNServiceBus\\WebApiNServiceBus.Proj.Specs\\bin\\Debug\\WebApiNServiceBus.Proj.Specs.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[9].Location
"C:\\Users\\alik\\AppData\\Local\\Temp\\nfx3urho.nhb\\WebApiNServiceBus.Proj.Specs\\assembly\\dl3\\6d69b640\\baacb725_f5f7cd01\\WebApiNServiceBus.Proj.Specs.dll"
System.AppDomain.CurrentDomain.GetAssemblies()[18].Location
"C:\\Users\\alik\\AppData\\Local\\Temp\\nfx3urho.nhb\\WebApiNServiceBus.Proj.Specs\\assembly\\dl3\\180be185\\4a3f842e_f3f7cd01\\WebApiNServiceBus.Proj.dll"