代码之家  ›  专栏  ›  技术社区  ›  kovac

如何在AspNet核心集成测试中为Autofac提供模拟接口?

  •  0
  • kovac  · 技术社区  · 5 年前

    我有一个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);
        }
    }
    

    但是,我的验证失败,记录的已执行调用为零。

    0 回复  |  直到 5 年前