我有一个web api项目,我正在尝试集成测试。控制器是:
[Route("hello")]
public sealed class MyController : Controller
{
private readonly IFoo _foo;
public MyController(IFoo foo)
{
_foo = foo;
}
[HttpGet]
public IActionResult Hello()
{
_foo.MethodToVerify();
return Ok("Foo");
}
}
IFoo
在WebApi中使用Autofac注册
ContainerBuilder
(建筑商)喜欢
public void Load(ContainerBuilder builder)
{
builder.RegisterType<FooImplementation>()
.WithAnotherInterface(builder, "hello")
.As<IFoo>();
}
在哪里?
WithAnotherInterface(string)
扩展方法如下:
public static IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> WithAnotherInterface<TLimit, TReflectionActivatorData, TStyle>(this IRegistrationBuilder<TLimit, TReflectionActivatorData, TStyle> reg, ContainerBuilder builder, string val)
: where TReflectionActivatorData : ReflectionActivatorData
{
builder.RegisterType<AnotherInterfaceImplementation>()
.Named<IAnotherInterface>("another")
.WithParameter(ResolvedParameter.ForNamed<IErrorHandler>(val))
.AutoActivate()
.SingleInstance();
return registration;
}
现在在我的测试中,我正在做:
public class MyTest : IClassFixture<WebApplicationFactory<Startup>>
{
private readonly IFoo _foo;
private readonly HttpClient _client;
private readonly WebApplicationFactory<Startup> _factory;
MyTest(WebApplicationFactory<Startup> factory)
{
_foo = Mock.Of<IFoo>();
_factory = factory;
_client = _factory.WithWebHostBuilder(builder =>
{
builder.ConfigureTestContainer<ContainerBuilder>(b =>
{
b.Register(ctx => _foo).SingleInstance().As<IFoo>();
});
})
.CreateClient();
}
[Fact]
public async Task Test()
{
var res = await _client.GetAsync("hello");
var mock = Mock.Get(_foo);
mock.Verify(v => v.MethodToVerify(), Times.Once);
}
}
但是,我的验证失败,记录的已执行调用为零。