Override Autofac registration - Integration tests with DI

后端 未结 2 867
耶瑟儿~
耶瑟儿~ 2021-01-13 12:18

I write integration tests for my application, and use my container for this. I want to be able to register all the components as I do in real running, and then override some

相关标签:
2条回答
  • 2021-01-13 12:42

    Autofac will use the last registered component as the default provider of that service

    From the AutoFac documation.

    In your arrange/setup/testInit phase register the mocks, then resolve the SUT:

    [SetUp]
    public void TestInit()
    {
        Mock<IFoo> mock = new Mock<IFoo>();
        builder.RegisterInstance(mock.object).As<IFoo>();
        ...
        ...
        _target = builder.Resolve<The component>();
    }
    

    Note:

    Singletons, static members and SingletonLifestyle(registration) may cause some troubles....

    0 讨论(0)
  • 2021-01-13 12:47

    Well, for example you can create a static action method inside your composition root to alter the current configuration and call it during testing. For example:

    public class CompositionRoot
    {
        public static Action<IContainer> OverrideContainer = c => { };
    
        internal static IContainer CreateContainer()
        {
            ContainerBuilder builder = new ContainerBuilder();
    
            /// etc. etc.
    
            var container = builder.Build();
    
            OverrideContainer(container);
    
            return container;
        }
    }
    

    After that you can create a mock of you server, for example, like this:

    [TestFixture]
    public class ConfigurationControllerFixture : BaseServer
    {
        [Test]
        public async Task verify_should_get_data()
        {
            var response = await GetAsync(Uri);
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
        }
    
        protected override string Uri
        {
            get { return "api/configuration"; }
        }
    }
    
    public abstract class BaseServer
    {
        protected TestServer Server;
        protected abstract string Uri { get; }
    
        protected virtual void OverrideConfiguration()
        {
            CompositionRoot.OverrideContainer = c =>
            {
                // new autofac configuration
                cb.Update(c);
            };
    
            AppStartup.OverrideConfiguration = c =>
            {
                // same as explained, but for HttpConfiguration
            };
        }
    }
    
    [SetUp]
    public void Setup()
    {
        OverrideConfiguration();
    
        Server = Microsoft.Owin.Testing.TestServer.Create(app =>
        {
           var startup = new AppStartup();
                startup.Configuration(app);
        });
    
        PostSetup(Server);
    }
    

    Hope it helps :)

    0 讨论(0)
提交回复
热议问题