public void ThrowsIfLoaderReturnsNull()
            {
                var underTest = new EfConfigurationLoader(ClassName, Mock.Of <ITypeLoader>());
                var cx        = Assert.Throws <ConfigurationErrorsException>(() => underTest.InstantiateEfConfigurationClass());

                Assert.Equal($"Could not find type '{ClassName}', configured in '{ConfigClassSettingKey}'", cx.Message);
            }
            public void ThrowsIfTypeIsNotAssignableToDbMigrationsConfiguration()
            {
                var mockLoader = new Mock <ITypeLoader>();
                var type       = typeof(NotAssignableToDbMigrationsConfiguration);

                Assert.False(typeof(DbMigrationsConfiguration).IsAssignableFrom(type));

                mockLoader.Setup(m => m.Load(ClassName)).Returns(type);
                var underTest = new EfConfigurationLoader(ClassName, mockLoader.Object);
                var cx        = Assert.Throws <ConfigurationErrorsException>(() => underTest.InstantiateEfConfigurationClass());

                Assert.Equal($"Type '{type.FullName}', configured in '{ConfigClassSettingKey}', does not extend DbMigrationsConfiguration", cx.Message);
            }
            public void ThrowsIfLoaderThrows()
            {
                var x          = new Exception(ExceptionMessage);
                var mockLoader = new Mock <ITypeLoader>();

                mockLoader.Setup(m => m.Load(ClassName)).Throws(x);

                var underTest = new EfConfigurationLoader(ClassName, mockLoader.Object);
                var cx        = Assert.Throws <ConfigurationErrorsException>(() => underTest.InstantiateEfConfigurationClass());

                Assert.Equal($"Error loading type '{ClassName}', configured in '{ConfigClassSettingKey}'", cx.Message);
                Assert.Equal(x, cx.InnerException);
            }
            public void HappyPath()
            {
                var mockLoader = new Mock <ITypeLoader>();
                var type       = typeof(CanInstantiate);

                Assert.True(typeof(DbMigrationsConfiguration).IsAssignableFrom(type));

                mockLoader.Setup(m => m.Load(ClassName)).Returns(type);
                var underTest = new EfConfigurationLoader(ClassName, mockLoader.Object);
                var instance  = underTest.InstantiateEfConfigurationClass();

                Assert.IsAssignableFrom <CanInstantiate>(instance);
            }
            public void ThrowsIfClassCannotBeInstantiated()
            {
                var mockLoader = new Mock <ITypeLoader>();
                var type       = typeof(CannotInstantiate);

                Assert.True(typeof(DbMigrationsConfiguration).IsAssignableFrom(type));

                mockLoader.Setup(m => m.Load(ClassName)).Returns(type);
                var underTest = new EfConfigurationLoader(ClassName, mockLoader.Object);
                var cx        = Assert.Throws <ConfigurationErrorsException>(() => underTest.InstantiateEfConfigurationClass());

                Assert.Equal($"Could not instantiate type '{type.FullName}', configured in '{ConfigClassSettingKey}'", cx.Message);
                Assert.NotNull(cx.InnerException);
                Assert.Equal("Exception has been thrown by the target of an invocation.", cx.InnerException.Message);
                Assert.NotNull(cx.InnerException.InnerException);
                Assert.Equal(ExceptionMessage, cx.InnerException.InnerException.Message);
            }