Asp.net web api 测试项目扫描我的控制器两次

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

我已经为这个特定的帖子创建了一个github repo,可以在

我试图做的是为我的WebApi应用程序编写测试。在我的规格测试中我

  • 创建HttpClient以使用WebApi
  • 通过HttpClient调用我的WebApi
  • 将结果序列化到列表中
  • 确保已调用NServiceBus
  • 所有这些都可以找到

    我也在使用StructureMap,我猜它会扫描我的APIController。似乎NServiceBus也会扫描我的APIController,因为当我尝试运行测试时,会出现以下错误:

    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
    
    要真正发现错误并不容易。我必须

  • 在Global.cs(Specs项目)的第21行和第26行放置断点
  • 调试测试并确保测试在第一个断点处停止
  • 浏览
    http://localhost:81/ValService/api/values/assets
    将只加载
  • 继续测试并确保测试在最后一个断点处停止
  • 在web浏览器中查看结果
  • 如果我删除所有包含IBU的行,并执行上述步骤,则测试通过。显然,NServiceBus与测试失败有关

    如前所述,NServiceBus似乎会扫描我的程序集以查找控制器。为了防止出现这种情况,我尝试在Global.cs中添加这一行,以指定NServiceBus应该扫描的内容,但没有成功

    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"