简单注射器的Web Api单元测试问题

时间:2016-02-09 19:42:43

标签: unit-testing asp.net-web-api dependency-injection nunit simple-injector

我在将Simple Injector插入我的api项目后运行我的nunit测试时遇到了问题。对服务的任何引用都不起作用,就好像它们没有正确加载一样。我尝试在我的测试中加载我的容器,如this post

中所述

服务仍未正确加载。

我在内存中运行测试,一旦引用了第一个服务,它们就会返回内部服务器错误。首先使用GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IExampleService));方法引用首先失败的服务,这些服务都将返回null。我尝试直接在我的测试中调用该服务,即使在构建容器后它也会返回null。

我们正在使用Web项目中的相同方法构建Simple Injector容器,并且测试没有引用服务的问题,这让我想知道内存测试是否是问题。

更新:请求完整堆栈跟踪。

最初我得到了这个例外:

  

{“不支持服务类型IApiService。\ r \ nParameter name:serviceType”}         在System.Web.Http.Services.DefaultServices.GetService(类型serviceType)         在Project.Api.Tests.Helpers.HttpRequestHelper.CreateRequest(String url,        HttpMethod方法,String key1,String key2,String secret,String baseUrl)       in ... Project.web \ src \ Project.Api.Tests \ Helpers \ HttpRequestHelper.cs:第537行

然后将此服务逻辑移入我的测试并尝试在我的测试中创建容器我收到:

  

System.InvalidOperationException:在应用程序的启动前初始化阶段,无法调用此方法。请注意,RegisterWebApiControllers(Container,HttpConfiguration)重载使用已配置的IAssembliesResolver。 Web API的默认IAssembliesResolver使用System.Web.Compilation.BuildManager,它不能在启动前初始化阶段或ASP.NET上下文之外使用(例如,在运行单元测试时)。要么确保稍后调用RegisterWebApiControllers方法,注册不依赖于BuildManager的自定义IAssembliesResolver,要么使用RegisterWebApiControllers(Container,HttpConfiguration,IEnumerable)重载手动提供程序集列表。

按照上述帖子的说明我收到了:

  

{[StackTrace,在Project.Api.Filters.HmacAuthenticationAttribute。
      d__1.MoveNext()在... \ Project.web \ src \ Project.Api \ Filters \ HmacAuthenticationAttribute.cs:第77行       ---从抛出异常的先前位置开始的堆栈跟踪结束---       在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)       在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)       在System.Web.Http.Controllers.AuthenticationFilterResult.d__0.MoveNext()       ---从抛出异常的先前位置开始的堆栈跟踪结束---       在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)       在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)       在System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()]}

该行引用来自代码中的这一行:

IExampleService _exampleService = (IExampleService)GlobalConfiguration
    .Configuration
    .DependencyResolver
    .GetService(typeof (IExampleService));
if (_exampleService.CheckValue(value))

0 个答案:

没有答案