public void InitialiseMockLogger()
 {
     var hierarchy = LogManager.GetRepository() as Hierarchy;
     mockLogger = hierarchy.Root.GetAppender("MemoryAppender") as MemoryAppender;
     if (mockLogger != null)
     {
         mockLogger.Clear();
     }
 }
        public void Log4NetCatchesUnhandledExceptionsTest()
        {
            // Arrange
            const string exceptionMessage = "myMessage";
            var testUri = new Uri("net.pipe://localhost/ExceptionThrower");

            var memoryAppender = new MemoryAppender();
            var hierarchy = (Hierarchy)LogManager.GetRepository();
            hierarchy.Root.AddAppender(memoryAppender);
            hierarchy.Root.Level = Level.Error;
            hierarchy.Configured = true;
            memoryAppender.Clear();

            var clientEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IExceptionThrowerService)),
                                                      new NetNamedPipeBinding(),
                                                      new EndpointAddress(testUri));

            var serviceEndpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IExceptionThrowerService)),
                                                      new NetNamedPipeBinding(),
                                                      new EndpointAddress(testUri));

            var factory =
                    new ChannelFactory<IExceptionThrowerService>(clientEndpoint);

            // Act
            using (var host = new ServiceHost(typeof(ExceptionThrowerService)))
            {
                host.AddServiceEndpoint(serviceEndpoint);
                host.Description.Behaviors.Add(new LogUnhandledExceptionBehavior());
                host.Open();

                try
                {
                    var service = factory.CreateChannel();
                    service.ThrowException(exceptionMessage);
                }
                catch(FaultException) 
                {
                    //swallow the returned exception (we know it's coming back)
                }
            }
            
            // Assert
            var events = memoryAppender.GetEvents();
            Assert.That(events.Count(), Is.GreaterThan(0));
            Assert.That(events.Last().ExceptionObject.Message, Is.EqualTo(exceptionMessage));
            //Display received exceptions
            events.Select(x => x.ExceptionObject.ToString()).ToList().ForEach(Console.WriteLine);
        }