// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. namespace ProductivityApiUnitTests { using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; using System.Data.Entity.Internal; using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.History; using System.Data.Entity.Resources; using System.Data.SqlClient; using System.Xml.Linq; using Moq; using Xunit; /// /// Unit tests for database initialization. /// public class DatabaseInitializationTests : TestBase { #region Helpers /// /// Used as a fake context type for tests that don't actually register a strategy. /// public class FakeNoRegContext : DbContext { } #endregion #region Negative initialization strategy tests [Fact] public void DropCreateDatabaseAlways_throws_when_given_a_null_context() { Assert.Equal( "context", Assert.Throws(() => new DropCreateDatabaseAlways().InitializeDatabase(null)).ParamName); } [Fact] public void CreateDatabaseIfNotExists_throws_when_given_a_null_context() { Assert.Equal( "context", Assert.Throws(() => new CreateDatabaseIfNotExists().InitializeDatabase(null)).ParamName); } [Fact] public void DropCreateDatabaseIfModelChanges_throws_when_given_a_null_context() { Assert.Equal( "context", Assert.Throws(() => new DropCreateDatabaseIfModelChanges().InitializeDatabase(null)). ParamName); } [Fact] public void MigrateDatabaseToLatestVersion_ctor_throws_when_given_null_connection_name() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("connectionStringName"), Assert.Throws(() => new MigrateDatabaseToLatestVersion(null)). Message); } [Fact] public void MigrateDatabaseToLatestVersion_ctor_throws_when_given_empty_connection_name() { Assert.Equal( Strings.ArgumentIsNullOrWhitespace("connectionStringName"), Assert.Throws(() => new MigrateDatabaseToLatestVersion(" ")). Message); } [Fact] public void MigrateDatabaseToLatestVersion_throws_when_given_invalid_connection_name() { var init = new MigrateDatabaseToLatestVersion("YouWontFindMe"); Assert.Equal( Strings.DbContext_ConnectionStringNotFound("YouWontFindMe"), Assert.Throws(() => init.InitializeDatabase(new EmptyContext())).Message); } #endregion #region Positive DropCreateDatabaseAlways strategy tests [Fact] public void DropCreateDatabaseAlways_performs_delete_create_and_seeding() { var tracker = new DatabaseInitializerTracker>( databaseExists: false); tracker.ExecuteStrategy(); Assert.Equal("DeleteIfExists Exists CreateDatabase Seed", tracker.Result); } [Fact] public void DropCreateDatabaseAlways_performs_delete_create_and_seeding_even_if_database_exists_and_model_matches() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: true); tracker.ExecuteStrategy(); Assert.Equal("DeleteIfExists Exists CreateDatabase Seed", tracker.Result); } #endregion #region Positive CreateDatabaseIfNotExists strategy tests [Fact] public void CreateDatabaseIfNotExists_creates_and_seeds_database_if_not_exists() { var tracker = new DatabaseInitializerTracker>(databaseExists: false); tracker.ExecuteStrategy(); Assert.Equal("Exists CreateDatabase Seed", tracker.Result); } [Fact] public void CreateDatabaseIfNotExists_does_nothing_if_database_exists_and_model_matches() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: true); tracker.ExecuteStrategy(); Assert.Equal("Exists", tracker.Result); } [Fact] public void CreateDatabaseIfNotExists_throws_if_database_exists_and_model_does_not_match() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: false); Assert.Equal( Strings.DatabaseInitializationStrategy_ModelMismatch(tracker.Context.GetType().Name), Assert.Throws(() => tracker.ExecuteStrategy()).Message); } [Fact] public void CreateDatabaseIfNotExists_does_nothing_if_database_exists_but_has_no_metadata() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: true, hasMetadata: false); tracker.ExecuteStrategy(); Assert.Equal("Exists", tracker.Result); } #endregion #region Positive DropCreateDatabaseIfModelChanges strategy tests [Fact] public void DropCreateDatabaseIfModelChanges_creates_and_seeds_database_if_not_exists() { var tracker = new DatabaseInitializerTracker>(databaseExists: false); tracker.ExecuteStrategy(); Assert.Equal("Exists Exists CreateDatabase Seed", tracker.Result); } [Fact] public void DropCreateDatabaseIfModelChanges_does_nothing_if_database_exists_and_model_matches() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: true); tracker.ExecuteStrategy(); Assert.Equal("Exists", tracker.Result); } [Fact] public void DropCreateDatabaseIfModelChanges_recreates_database_if_database_exists_and_model_does_not_match() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: false); tracker.ExecuteStrategy(); Assert.Equal("Exists DeleteIfExists Exists CreateDatabase Seed", tracker.Result); } [Fact] public void DropCreateDatabaseIfModelChanges_throws_if_database_exists_but_has_no_metadata() { var tracker = new DatabaseInitializerTracker>( databaseExists: true, modelCompatible: true, hasMetadata: false); Assert.Equal(Strings.Database_NoDatabaseMetadata, Assert.Throws(() => tracker.ExecuteStrategy()).Message); } #endregion #region Positive MigrateDatabaseToLatestVersion strategy tests public class EmptyContext : DbContext { } private class TestMigrationsConfiguration : DbMigrationsConfiguration { public TestMigrationsConfiguration() { MigrationsNamespace = "You.Wont.Find.Any.Migrations.Here"; AutomaticMigrationsEnabled = true; } protected override void Seed(EmptyContext context) { SeedCalled = true; SeedDatabase = context.Database.Connection.Database; } public static bool SeedCalled { get; set; } public static string SeedDatabase { get; set; } } [Fact] public void MigrateDatabaseToLatestVersion_invokes_migrations_pipeline_to_latest_version() { var init = new MigrateDatabaseToLatestVersion(); TestMigrationsConfiguration.SeedCalled = false; init.InitializeDatabase(new EmptyContext()); // If seed gets called we know the migrations pipeline was invoked to update to the latest version Assert.True(TestMigrationsConfiguration.SeedCalled); } [Fact] public void MigrateDatabaseToLatestVersion_use_connection_name_from_config_file() { var init = new MigrateDatabaseToLatestVersion( "MigrateDatabaseToLatestVersionNamedConnectionTest"); TestMigrationsConfiguration.SeedDatabase = null; init.InitializeDatabase(new EmptyContext()); Assert.Equal("MigrationInitFromConfig", TestMigrationsConfiguration.SeedDatabase); } #endregion #region Positive Database.SetInitializer tests public class FakeForSirdi : DbContextUsingMockInternalContext { } [Fact] public void SetInitializer_registers_different_initializer() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); var mock = new Mock>(); mock.Setup(m => m.AppConfig).Returns(new AppConfig(CreateEmptyConfig())); new Database(mock.Object).Initialize(force: true); } public class FakeForSirdifdct1 : DbContextUsingMockInternalContext { } public class FakeForSirdifdct2 : DbContextUsingMockInternalContext { } [Fact] public void SetInitializer_registers_different_initializers_for_different_context_types() { var mockInitializer1 = new Mock>(); Database.SetInitializer(mockInitializer1.Object); var mockInitializer2 = new Mock>(); Database.SetInitializer(mockInitializer2.Object); // Initialize for first type and verify correct initializer called var mock = new Mock>(); mock.Setup(m => m.AppConfig).Returns(new AppConfig(CreateEmptyConfig())); new Database(mock.Object).Initialize(force: true); mockInitializer1.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); mockInitializer2.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Never()); // Initialize for second type and verify correct initializer called var mock2 = new Mock>(); mock2.Setup(m => m.AppConfig).Returns(new AppConfig(CreateEmptyConfig())); new Database(mock2.Object).Initialize(force: true); mockInitializer1.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); mockInitializer2.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); } public class FakeForCsiaftsctrfi : DbContextUsingMockInternalContext { } [Fact] public void Calling_SetInitializer_again_for_the_same_context_type_replaces_first_initializer() { var mockInitializer1 = new Mock>(); Database.SetInitializer(mockInitializer1.Object); var mockInitializer2 = new Mock>(); Database.SetInitializer(mockInitializer2.Object); var mock = new Mock>(); mock.Setup(m => m.AppConfig).Returns(new AppConfig(CreateEmptyConfig())); new Database(mock.Object).Initialize(force: true); mockInitializer1.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Never()); mockInitializer2.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); } public class FakeForDisicdoine : DbContext { } [Fact] public void Default_initialization_strategy_is_CreateDatabaseIfNotExists() { var tracker = new DatabaseInitializerTracker>(databaseExists: false); tracker.Context.Database.Initialize(force: true); Assert.Equal("UseTempObjectContext Exists CreateDatabase DisposeTempObjectContext", tracker.Result); } public class FakeForDisirbcsiwn : DbContext { } [Fact] public void Default_initialization_strategy_is_removed_by_calling_SetInitializer_with_null() { var tracker = new DatabaseInitializerTracker>(databaseExists: false); var mockContextType = tracker.Context.GetType(); var initMethod = typeof(Database).GetMethod("SetInitializer").MakeGenericMethod(mockContextType); initMethod.Invoke(null, new object[] { null }); tracker.Context.Database.Initialize(force: true); Assert.Equal("UseTempObjectContext DisposeTempObjectContext", tracker.Result); } public class FakeForIscbrbcsin : DbContextUsingMockInternalContext { } [Fact] public void Initialization_strategy_can_be_removed_by_calling_SetInitializer_null() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); Database.SetInitializer(null); var mock = new Mock>(); mock.Setup(m => m.AppConfig).Returns(new AppConfig(CreateEmptyConfig())); new Database(mock.Object).Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Never()); } #endregion #region Database.Initialize (with force false) positive tests public class FakeForEieiidhnabi : DbContext { } [Fact] public void Initialize_without_force_executes_initializer_if_database_has_not_already_been_initialized() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); new FakeForEieiidhnabi().Database.Initialize(force: false); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); } public class FakeForEidneiidhabi : DbContext { } [Fact] public void Initialize_without_force_does_not_execute_initializer_if_database_has_already_been_initialized() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); // This will call the initializer new FakeForEidneiidhabi().Database.Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); // This should not call it again new FakeForEidneiidhabi().Database.Initialize(force: false); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); } public class FakeForIeiwdhnbi : DbContext { } [Fact] public void Initialize_executes_initializer_when_database_has_not_been_initialized() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); new FakeForIeiwdhnbi().Database.Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); } public class FakeForIeiewdhabi : DbContext { } [Fact] public void Initialize_executes_initializer_even_when_database_has_already_been_initialized() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); new FakeForIeiewdhabi().Database.Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Once()); new FakeForIeiewdhabi().Database.Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Exactly(2)); } #endregion #region ModelMatches positive tests [Fact] public void CompatibleWithModel_returns_true_if_model_was_not_created_with_Code_First_and_throwing_is_switched_off() { var mockInternalContext = new Mock { CallBase = true }; mockInternalContext.Setup(c => c.CodeFirstModel).Returns((DbCompiledModel)null); Assert.True(new Database(mockInternalContext.Object).CompatibleWithModel(throwIfNoMetadata: false)); } #endregion #region Database initialization status positive tests internal class NonInitializingLazyInternalContext : LazyInternalContext { public NonInitializingLazyInternalContext(IInternalConnection internalConnection, DbCompiledModel model) : base(new Mock().Object, internalConnection, model) { } protected override void InitializeContext() { } } #endregion #region TempObjectContext and GetObjectContextWithoutDatabaseInitialization positive tests public class FakeForGocwdidnid : DbContext { } [Fact] public void GetObjectContextWithoutDatabaseInitialization_does_not_initialize_database() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); new FakeForGocwdidnid().InternalContext.GetObjectContextWithoutDatabaseInitialization(); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Never()); } public class FakeForUtoccatoc : DbContext { } [Fact] public void UseTempObjectContext_creates_a_temporary_object_context() { var internalContext = new FakeForUtoccatoc().InternalContext; var realContext = internalContext.GetObjectContextWithoutDatabaseInitialization(); internalContext.UseTempObjectContext(); Assert.NotSame(realContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); internalContext.DisposeTempObjectContext(); Assert.Same(realContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); } public class FakeForUtoccmtocotoc : DbContext { } [Fact] public void UseTempObjectContext_called_multiple_times_only_creates_one_temporary_object_context() { var internalContext = new FakeForUtoccmtocotoc().InternalContext; var realContext = internalContext.GetObjectContextWithoutDatabaseInitialization(); internalContext.UseTempObjectContext(); var fakeContext = internalContext.GetObjectContextWithoutDatabaseInitialization(); internalContext.UseTempObjectContext(); Assert.Same(fakeContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); internalContext.UseTempObjectContext(); Assert.Same(fakeContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); internalContext.DisposeTempObjectContext(); Assert.Same(fakeContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); internalContext.DisposeTempObjectContext(); Assert.Same(fakeContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); internalContext.DisposeTempObjectContext(); Assert.Same(realContext, internalContext.GetObjectContextWithoutDatabaseInitialization()); } public class FakeForLctdtocdttc : DbContext { } [Fact] public void Last_call_to_DisposeTempObjectContext_disposes_the_temp_context() { var internalContext = new FakeForLctdtocdttc().InternalContext; internalContext.UseTempObjectContext(); internalContext.UseTempObjectContext(); var fakeContext = internalContext.GetObjectContextWithoutDatabaseInitialization(); internalContext.DisposeTempObjectContext(); internalContext.DisposeTempObjectContext(); Assert.Throws(() => fakeContext.SaveChanges()).ValidateMessage( "ObjectContext_ObjectDisposed"); } #endregion #region ModelMatches tests private static Mock> CreateContextForCompatibleTest( bool modelMatches, bool codeFirst = true) { var mockInternalContext = new Mock>(); mockInternalContext.Setup(c => c.CodeFirstModel).Returns(codeFirst ? new DbCompiledModel() : null); mockInternalContext.Setup(c => c.QueryForModel()).Returns(new XDocument()); mockInternalContext.Setup(c => c.ModelMatches(It.IsAny())).Returns(modelMatches); return mockInternalContext; } private static Mock> CreateContextForCompatibleTest( string databaseHash, bool codeFirst = true) { var mockInternalContext = new Mock>(); mockInternalContext.Setup(c => c.CodeFirstModel).Returns(codeFirst ? new DbCompiledModel() : null); mockInternalContext.Setup(c => c.QueryForModel()).Returns((XDocument)null); mockInternalContext.Setup(c => c.QueryForModelHash()).Returns(databaseHash); return mockInternalContext; } [Fact] public void CompatibleWithModel_returns_true_if_model_matches_database_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(modelMatches: true); var mockHashFactory = new Mock(); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)); } [Fact] public void CompatibleWithModel_returns_true_if_model_matches_database_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(modelMatches: true); var mockHashFactory = new Mock(); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_returns_false_if_model_does_not_match_database_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(modelMatches: false); var mockHashFactory = new Mock(); Assert.False( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)); } [Fact] public void CompatibleWithModel_returns_false_if_model_does_not_match_database_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(modelMatches: false); var mockHashFactory = new Mock(); Assert.False( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_returns_true_if_model_matches_database_using_model_hash_check_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(""); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)); } [Fact] public void CompatibleWithModel_returns_true_if_model_matches_database_using_model_hash_check_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(""); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_returns_false_if_model_does_not_match_database_using_model_hash_check_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(""); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.False( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)); } [Fact] public void CompatibleWithModel_returns_false_if_model_does_not_match_database_using_model_hash_check_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(""); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.False( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_returns_true_if_model_is_not_from_code_first_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest("", codeFirst: false); var mockHashFactory = new Mock(); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_returns_true_if_database_has_no_hash_and_method_is_asked_not_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(null); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.True( new ModelCompatibilityChecker() .CompatibleWithModel(mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: false)); } [Fact] public void CompatibleWithModel_throws_if_model_is_not_from_code_first_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest("", codeFirst: false); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns((string)null); Assert.Equal( Strings.Database_NonCodeFirstCompatibilityCheck, Assert.Throws( () => new ModelCompatibilityChecker().CompatibleWithModel( mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)).Message); } [Fact] public void CompatibleWithModel_throws_if_database_has_no_hash_and_method_is_asked_to_throw() { var mockInternalContext = CreateContextForCompatibleTest(null); var mockHashFactory = new Mock(); mockHashFactory.Setup(f => f.Calculate(It.IsAny())).Returns(""); Assert.Equal( Strings.Database_NoDatabaseMetadata, Assert.Throws( () => new ModelCompatibilityChecker().CompatibleWithModel( mockInternalContext.Object, mockHashFactory.Object, throwIfNoMetadata: true)).Message); } #endregion #region TryGetModelHash tests [Fact] public void TryGetModelHash_throws_when_given_null_context() { #pragma warning disable 612,618 Assert.Equal("context", Assert.Throws(() => EdmMetadata.TryGetModelHash(null)).ParamName); #pragma warning restore 612,618 } #endregion #region DatabaseCreator tests [Fact] public void Database_Create_calls_CreateDatabase_if_database_does_not_exist() { var mockOperations = new Mock(); var mockContext = new Mock>(); mockContext.Setup(m => m.DatabaseOperations).Returns(mockOperations.Object); mockContext.Setup(m => m.CreateObjectContextForDdlOps()).Returns(new Mock().Object); mockOperations.Setup(m => m.Exists(null)).Returns(false); mockContext.Object.Owner.Database.Create(); mockContext.Verify(m => m.CreateDatabase(null), Times.Once()); } [Fact] public void Database_CreateIfNotExists_calls_CreateDatabase_if_database_does_not_exist() { var mockOperations = new Mock(); var mockContext = new Mock>(); mockContext.Setup(m => m.DatabaseOperations).Returns(mockOperations.Object); mockContext.Setup(m => m.CreateObjectContextForDdlOps()).Returns(new Mock().Object); mockOperations.Setup(m => m.Exists(null)).Returns(false); mockContext.Object.Owner.Database.CreateIfNotExists(); mockContext.Verify(m => m.CreateDatabase(null), Times.Once()); } [Fact] public void Database_Create_throws_and_does_not_call_CreateDatabase_if_database_exists() { var mockOperations = new Mock(); var mockContext = new Mock>(); mockContext.Setup(m => m.DatabaseOperations).Returns(mockOperations.Object); mockContext.Setup(m => m.CreateObjectContextForDdlOps()).Returns(new Mock().Object); mockContext.Setup(m => m.Connection).Returns(new SqlConnection("Database=Foo")); mockOperations.Setup(m => m.Exists(null)).Returns(true); Assert.Equal( Strings.Database_DatabaseAlreadyExists("Foo"), Assert.Throws(() => mockContext.Object.Owner.Database.Create()).Message); mockContext.Verify(m => m.CreateDatabase(null), Times.Never()); } [Fact] public void Database_CreateIfNotExists_does_not_call_CreateDatabase_if_database_exists() { var mockOperations = new Mock(); var mockContext = new Mock>(); mockContext.Setup(m => m.DatabaseOperations).Returns(mockOperations.Object); mockContext.Setup(m => m.CreateObjectContextForDdlOps()).Returns(new Mock().Object); mockOperations.Setup(m => m.Exists(null)).Returns(true); mockContext.Object.Owner.Database.CreateIfNotExists(); mockContext.Verify(m => m.CreateDatabase(null), Times.Never()); } public class FakeContext : DbContext { static FakeContext() { Database.SetInitializer(null); } } #endregion [Fact] public void Initializer_never_run_for_history_contexts() { var mockInitializer = new Mock>(); Database.SetInitializer(mockInitializer.Object); new HistoryContext().Database.Initialize(force: true); mockInitializer.Verify(i => i.InitializeDatabase(It.IsAny()), Times.Never()); } } }