如题,做控制器单元测试,已经设置了把controller当做服务,services.AddMvc().AddControllersAsServices(),用了autofac替代了默认注入方式,做单元测试时不能像以下这种方式获取controller了
[SetUp]
public void Init()
{
var server = new TestServer(WebHost.CreateDefaultBuilder().UseStartup<Startup>());
_deviceTest = server.Host.Services.GetService<DeviceTestController>();
}
请教各位大神用了autofac后,做单元测试时怎样获取控制器的注入对象
你要拿到Controller对象本身就是错误的。
如果是要对Controller测试,请使用 TestServer.CreateClient().......
通过.AddControllersAsServices()可以把controller当做一个service,然后按上面问题中提到的那样拿到controller的注入对象,但是改成autofac后不知道怎么获取了,也是要看下覆盖率,TestServer.CreateClient()跟直接用postman没多大区别了,没办法看到action的覆盖率
感谢czd890的回答,问题解决了,原因是自己写autofac批量注入时不小心把接口程序集放到注入的语法中了,导致“None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'”错误,改了之后问题中所提方式依然可以
请教下如果controller是独立的project程序集(类库)
//程序集
var moduleAssembly = Assembly.LoadFrom(controllerPath);
//注册controllers
builder.RegisterAssemblyTypes(moduleAssembly)
.Where(t => typeof(ControllerBase).IsAssignableFrom(t) && t != typeof(ControllerBase))
.PropertiesAutowired();//允许属性注入
为了解耦不作引用程序集,这样无效。swagger也无法生成webapi接口,请问有没有解决办法?多谢