Asp.net web api Web API Nunit测试不注入依赖项
当尝试对我的WebAPI项目进行单元测试时,我遇到了错误 {[消息,发生错误。]} ExceptionMessage,尝试创建“ExampleController”类型的控制器时出错。确保控制器具有无参数公共构造函数。 {[ExceptionType,System.InvalidOperationException]} {[StackTrace,位于System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType) 在System.Web.Http.Controllers.HttpControllerDescriptor.CreateController上(HttpRequestMessage请求) 在System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext()]} {[InnerException,System.Web.Http.HttpError]} 单元测试:Asp.net web api Web API Nunit测试不注入依赖项,asp.net-web-api,dependency-injection,nunit,simple-injector,Asp.net Web Api,Dependency Injection,Nunit,Simple Injector,当尝试对我的WebAPI项目进行单元测试时,我遇到了错误 {[消息,发生错误。]} ExceptionMessage,尝试创建“ExampleController”类型的控制器时出错。确保控制器具有无参数公共构造函数。 {[ExceptionType,System.InvalidOperationException]} {[StackTrace,位于System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpReque
[TestFixtureSetUp]
public void TestsSetup()
{
_server = HttpRequestHelper.SetupHttpServerDefault();
}
[Test]
public void CanGetAllAddresses()
{
var client = new HttpClient(_server);
var request = HttpRequestHelper.CreateRequest("memory/address", HttpMethod.Get, ConfigurationManager.AppSettings["KeyUser"], string.Empty, ConfigurationManager.AppSettings["SecretUser"]);
using (HttpResponseMessage response = client.SendAsync(request).Result)
{
Assert.NotNull(response.Content);
}
}
我正在nunitTestFixtureSetUp
函数中注册控制器,该函数涉及以下逻辑:
public static HttpServer SetupHttpServerDefault()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "memory/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var container = new Container();
container.Register<IAddressService, AddressService>();
var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver().
GetControllerTypes(services.GetAssembliesResolver());
foreach (var controllerType in controllerTypes)
{
var registration = Lifestyle.Transient.
CreateRegistration(controllerType, container);
container.AddRegistration(controllerType, registration);
registration.SuppressDiagnosticWarning
(DiagnosticType.DisposableTransientComponent, "");
}
container.Verify();
GlobalConfiguration.Configuration.DependencyResolver = new
SimpleInjectorWebApiDependencyResolver(container);
return new HttpServer(config);
}
当删除控制器参数时,我能够调试控制器,这表明我没有正确地将依赖项注入控制器。我看过这篇文章,看起来很相似,但我不知道如何明确声明我的控制器。我尝试对我的服务使用类似的方法,但没有成功。我的特定问题的解决方案实际上是在我在测试中创建的内存
HttpServer
以及全局配置上注册依赖项解析程序。在上面的问题中,您将看到config
变量的创建,然后这是修复我的问题的代码:
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
没有config.DependencyResolver
我无法通过以下方式连接到我的项目控制器:
using (HttpResponseMessage response = client.SendAsync(request).Result)
如果没有GlobalConfiguration.Configuration.DependencyResolver
,我无法在本地联系测试项目中的服务。希望这对其他人有帮助 请同时显示测试代码。@qujck测试代码已添加。问题是否由引用GlobalConfiguration
而不是在创建HttpServer
的config
变量中执行所有操作引起?请添加完整堆栈跟踪。@Steven完整堆栈跟踪已添加到这个问题。另外,我希望你们都知道,我在控制器中使用(httpresponsemessageresponse=client.SendAsync(request.Result)
在行中得到异常。
using (HttpResponseMessage response = client.SendAsync(request).Result)