Exemple #1
0
            public static IQueryHandler <TQuery, TResponse> Default <TQuery, TResponse>(object handler, IServiceProvider provider) where TQuery : IQuery <TResponse>
            {
                var logger              = provider.GetService <ILogger>();
                var validations         = provider.GetServices <IValidator <TQuery> >();
                var loggingDecorator    = new LoggingQueryDecorator <TQuery, TResponse>((IQueryHandler <TQuery, TResponse>)handler, logger);
                var validationDecorator = new ValidationQueryDecorator <TQuery, TResponse>(loggingDecorator, validations);
                var retryDecorator      = new RetryQueryDecorator <TQuery, TResponse>(validationDecorator, logger);

                return(retryDecorator); // order is revers for decorators
            }
        public void Test_ReturnsCorrectValueOnNoErrors()
        {
            // Arrange
            int expected  = 5;
            var queryMock = new Mock <IQuery <int, int> >();

            queryMock.SetupSequence(x => x.Execute(It.IsAny <int>()))
            .Returns(expected);

            var sut = new RetryQueryDecorator <int, int>(queryMock.Object);

            // Act
            var actual = sut.Execute(0);

            // Assert
            Assert.Equal(expected, actual);
            queryMock.Verify(x => x.Execute(It.IsAny <int>()), Times.Exactly(1));
        }
        public void Test_ThrowsAfterRetriesOnErrors()
        {
            // Arrange
            var queryMock = new Mock <IQuery <int, int> >();

            queryMock.SetupSequence(x => x.Execute(It.IsAny <int>()))
            .Throws(new ArgumentException())
            .Throws(new ArgumentException())
            .Throws(new ArgumentException())
            .Throws(new ArgumentException())
            .Throws(new ArgumentException())
            .Throws(new ArgumentException());

            var sut = new RetryQueryDecorator <int, int>(queryMock.Object);

            // Act
            Assert.Throws <ArgumentException>(() => sut.Execute(0));
            queryMock.Verify(x => x.Execute(It.IsAny <int>()), Times.Exactly(5));
        }