gpt4 book ai didi

asp.net-web-api - 测试项目扫描我的 Controller 两次

转载 作者:行者123 更新时间:2023-12-02 02:07:06 25 4
gpt4 key购买 nike

我已经为这个特定的帖子创建了一个 github 存储库,可以在 https://github.com/CrazyInCode/WebApiNServiceBus 找到

我想做的是为我的 WebApi 应用程序编写测试。在我的规范测试中,我...

  1. 创建一个 HttpClient 来使用 WebApi
  2. 通过 HttpClient 调用我的 WebApi
  3. 将结果序列化成列表
  4. 确保已调用 NServiceBus

这一切都可以找到here .

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

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

要真正发现错误并不容易。我必须...

  1. 在 Global.cs(Specs 项目)的第 21 和 26 行放置一个断点
  2. 调试测试并确保测试在第一个断点处停止
  3. 浏览 http://localhost:81/ValService/api/values/assets 它将加载...
  4. 继续测试并确保测试在最后一个断点处停止
  5. 在网络浏览器中查看结果

如果我删除所有包含 IBus 的行,并执行上述步骤 - 测试通过。显然 NServiceBus 与测试失败有关。

正如我之前所说,NServiceBus 似乎在扫描我的程序集以查找 Controller 。为防止这种情况,我尝试在 Global.cs 中添加这一行以指定 NServiceBus 应扫描的内容 - 但没有成功。

Configure.With(Enumerable.Empty<Assembly>());

解决方案中的主要组件是 WebApi、NServiceBus、StructureMap、FakeItEasy 和 SpecFlow。

我卡住了。我怎样才能通过测试?

编辑:也许解决方案是让 WebApi 不注册 Controller ——把它留给 NServiceBus?我该如何尝试?

最佳答案

更新:截至 FakeItEasy 1.19.0 ,这不应该发生。如果你 explicitly ask for this behaviour by implementing a custom Bootstrapper,FakeItEasy 将只扫描磁盘上的程序集.

我不知道 StructureMap 和 NServiceBus 是如何工作的,但幸运的是,就在今天早上,我发表了一篇关于 how FakeItEasy scans assemblies 的博文,我认为它可以为您提供一些答案。

要点:您看到的程序集副本,以及使用 System.AppDomain.CurrentDomain.GetAssemblies() 列出的@Aliostad,都是影子副本,几乎可以肯定是由 ReSharper 测试运行程序制作的。您可以指示运行者不要制作这些副本。

1.13 版之前的 FakeItEasy 会扫描应用程序域中的所有程序集和应用程序目录中的所有 DLL - 这会导致在卷影复制打开时加载重复的程序集。

在 1.13 中,有两个优化。第一个是如果一个程序集已经加载,它不会从文件系统重新加载它 如果位置匹配。不幸的是,卷影副本打败了这项检查。

第二个优化可能对您有所帮助 - FakeItEasy 将从磁盘加载程序集仅用于反射,如果程序集不引用 FakeItEasy,它不会被完全加载,它的类型也不会不会被扫描。由于应完全加载的程序集更少,因此您可以避免重复类型问题。

我建议选择 FakeItEasy 1.13。尝试打开和关闭卷影副本。哎呀,即使只是关闭当前版本的卷影副本也可能有所帮助。

关于asp.net-web-api - 测试项目扫描我的 Controller 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14437897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com