public void ActivatorScope_should_release_and_dispose_scoped_job_when_disposed()
        {
            var container = new WindsorContainer();

            IDisposableJob job = null;

            container.Register(
                Component.For <IDisposableJob>()
                .UsingFactoryMethod(A.Fake <IDisposableJob>)
                .OnDestroy(x => { job = x; })
                .LifestyleScoped()
                );

            // For details about how this works see:
            // https://github.com/HangfireIO/Hangfire/blob/129707d66fde24dc6379fb9d6b15fa0b8ca48605/src/Hangfire.Core/Server/CoreBackgroundJobPerformer.cs#L47
            var activator = new WindsorJobActivator(container.Kernel);

            // Start a new job scope
            using (var scope = activator.BeginScope(null))
            {
                // Resolve the new job
                var resolvedJob = scope.Resolve(typeof(IDisposableJob)) as IDisposableJob;
                Assert.IsNotNull(resolvedJob);
            }

            Assert.IsNotNull(job, "job was not released by container");

            A.CallTo(() => job.Dispose()).MustHaveHappened();
        }
        public void ActivatorScope_should_release_and_dispose_job_when_disposed()
        {
            var container = new WindsorContainer();

            IDisposableJob job = null;

            container.Register(
                Component.For <IDisposableJob>()
                .UsingFactoryMethod(A.Fake <IDisposableJob>)
                .OnDestroy(x => { job = x; })
                .LifeStyle.Transient
                );

            // For details about how this works see:
            // https://github.com/HangfireIO/Hangfire/blob/129707d66fde24dc6379fb9d6b15fa0b8ca48605/src/Hangfire.Core/Server/CoreBackgroundJobPerformer.cs#L47
            var activator = new WindsorJobActivator(container.Kernel);

            // Start a new job scope
            using (var scope = activator.BeginScope(null))
            {
                // Resolve the new job
                var resolvedJob = scope.Resolve(typeof(IDisposableJob)) as IDisposableJob;

                // As long as we're in the scope, windsor should track the component
                Assert.IsTrue(container.Kernel.ReleasePolicy.HasTrack(resolvedJob));
            }

            // When we leave the scope windsor should stop tracking the resolved job
            Assert.IsFalse(container.Kernel.ReleasePolicy.HasTrack(job));

            A.CallTo(() => job.Dispose()).MustHaveHappened();
        }