Web API Nunit 测试未注入依赖项
Web API Nunit Tests not injecting dependencies
尝试对我的 Web api 项目进行单元测试时,出现错误
{[Message, An error has occurred.]}
ExceptionMessage, An error occurred when trying to create a controller of type 'ExampleController'. Make sure that the controller has a parameterless public constructor.
{[ExceptionType, System.InvalidOperationException]}
{[StackTrace, at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()]}
{[InnerException, System.Web.Http.HttpError]}
单元测试:
[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);
}
}
我正在一个涉及此逻辑的 nunit TestFixtureSetUp
函数中注册我的控制器:
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);
}
我的地址控制器是这样开始的:
public class AddressController : BaseController
{
private readonly IAddressService _addressService;
public AddressController(IAddressService addressService)
{
_addressService = addressService;
}
}
当删除控制器参数时,我能够调试控制器,这告诉我我没有正确地将依赖项注入控制器。我查看了这个 post here ,它看起来很相似,但我不熟悉如何明确声明我的控制器。我尝试对我的服务使用类似的方法,但没有成功。
我的特定问题的解决方案实际上是在我在测试中创建的内存 HttpServer
和 GlobalConfiguration
上注册依赖项解析器。在问题的上方,您会看到 config
变量的创建,然后这是解决我的问题的代码:
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
没有 config.DependencyResolver
我无法通过以下方式连接到我的项目控制器:
using (HttpResponseMessage response = client.SendAsync(request).Result)
如果没有 GlobalConfiguration.Configuration.DependencyResolver
,我无法在我的测试项目中联系本地服务。希望这对其他人有帮助!
尝试对我的 Web api 项目进行单元测试时,出现错误
{[Message, An error has occurred.]} ExceptionMessage, An error occurred when trying to create a controller of type 'ExampleController'. Make sure that the controller has a parameterless public constructor. {[ExceptionType, System.InvalidOperationException]} {[StackTrace, at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request) at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()]} {[InnerException, System.Web.Http.HttpError]}
单元测试:
[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);
}
}
我正在一个涉及此逻辑的 nunit TestFixtureSetUp
函数中注册我的控制器:
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);
}
我的地址控制器是这样开始的:
public class AddressController : BaseController
{
private readonly IAddressService _addressService;
public AddressController(IAddressService addressService)
{
_addressService = addressService;
}
}
当删除控制器参数时,我能够调试控制器,这告诉我我没有正确地将依赖项注入控制器。我查看了这个 post here ,它看起来很相似,但我不熟悉如何明确声明我的控制器。我尝试对我的服务使用类似的方法,但没有成功。
我的特定问题的解决方案实际上是在我在测试中创建的内存 HttpServer
和 GlobalConfiguration
上注册依赖项解析器。在问题的上方,您会看到 config
变量的创建,然后这是解决我的问题的代码:
config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
没有 config.DependencyResolver
我无法通过以下方式连接到我的项目控制器:
using (HttpResponseMessage response = client.SendAsync(request).Result)
如果没有 GlobalConfiguration.Configuration.DependencyResolver
,我无法在我的测试项目中联系本地服务。希望这对其他人有帮助!