Recreate and Reseed LocalDb Before Each Unit Test

后端 未结 3 2059
刺人心
刺人心 2020-12-14 11:22

I\'m attempting to write unit/integration tests for my ASP.NET Web API project and struggling to run each test in isolation. Allow me to explain.

I have a *.testset

3条回答
  •  误落风尘
    2020-12-14 11:44

    Here's what I ended up doing for anyone that is interested.

    I extended DropCreateDatabaseAlways and overrode the Seed method to populate my database with known test data that my unit tests can rely on.

    public class MyDatabaseInitializer : System.Data.Entity.DropCreateDatabaseAlways
    {
        protected override void Seed(MyDbContext context)
        {
            // Add entities to database.
    
            context.SaveChanges();
        }
    }
    

    I then implemented an [AssemblyInitialize] method which sets the database initializer.

    [TestClass]
    public class Global
    {
        [AssemblyInitialize]
        public static void AssemblyInitialize(TestContext context)
        {
            System.Data.Entity.Database.SetInitializer(new MyDatabaseInitializer());
        }
    }
    

    This sets the initializer for the database but does not actually run it. The intitializer is run in a [TestInitialize] method I wrote which forces the database to be dropped, recreated and reseeded before each test.

    [TestClass]
    public class MyTestClass
    {
        [TestInitialize]
        public void TestInitialize()
        {
            MyDbContext context = new MyDbContext();
            context.Database.Initialize(true);
        }
    
        [TestMethod]
        public void MyUnitTest()
        {
            Assert.IsTrue(true);
        }
    }
    

提交回复
热议问题