首页 > 解决方案 > 如何在 .Net 中设置实体框架单元测试

问题描述

如何在 中设置数据库并在 中[TestInitialize]删除它[TestCleanup]

此代码最终会为每个方法为数据库播种一次,因此它仅在一次调用一个测试时才有效。不好。

using Microsoft.EntityFrameworkCore;
using KK;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;

namespace KKTest
{
    [TestClass] public class TestDataTests
    {
        DbContextOptions<ApplicationDbContext> inMemory = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(databaseName: "TestDb").Options;

        void seedDb(ApplicationDbContext _context) {
            var db = new TestData(_context);
            db.SeedDb();
        }

        [TestMethod] public void TestEquipment() {
            using var context = new ApplicationDbContext(inMemory);
            seedDb(context);
            var equipment = context.Equipment.ToList();
            Assert.IsTrue(equipment.Count() == 7, "Expecting 7 Pieces of Equipment in TestData");
        }

        [TestMethod] public void TestEachEquipmentHas4Rates() {
            using var context = new ApplicationDbContext(inMemory);
            seedDb(context);
            var equipment = context.Equipment.Include(e => e.Rates).ToList();
            foreach(var e in equipment) {
                Assert.IsTrue(e.Rates.Count() == 4, "Expecting 4 Rates associated w. Equipment in TestData");
            }
        }

        [TestMethod] public void TestCustomers() {
            using var context = new ApplicationDbContext(inMemory);
            seedDb(context);
            var customers = context.Customer.ToList();
            Assert.IsTrue(customers.Count() == 2, "Expecting 2 Customers in TestData");
        }

        [TestMethod] public void TestRentals() {
            using var context = new ApplicationDbContext(inMemory);
            seedDb(context);
            var rentals = context.Rental.ToList();
            Assert.IsTrue(rentals.Count() == 2, "Expecting 2 Rentals in TestData");
        }
    }
}

此代码运行但调试不起作用,所有测试都失败并且在任何方法中都遇到断点。

using Microsoft.EntityFrameworkCore;
using KK;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;

namespace KKTest
{
    [TestClass] public class TestDataTests
    {
        DbContextOptions<ApplicationDbContext> inMemory = new DbContextOptionsBuilder<ApplicationDbContext>()
            .UseInMemoryDatabase(databaseName: "TestDb").Options;
        ApplicationDbContext ctx; //really the db as far as dev is concerned

         [TestInitialize] void SeedDb(ApplicationDbContext _context) {
            ctx = new ApplicationDbContext(inMemory);
            var data = new TestData(ctx);
            data.SeedDb();
         }

        [TestCleanup] void CleanUp() {
            ctx = null;
        }

        [TestMethod] public void TestEquipment() {
            var equipment = ctx.Equipment.ToList();
            Assert.IsTrue(equipment.Count() == 7, "Expecting 7 Pieces of Equipment in TestData");
        }

        [TestMethod] public void TestEachEquipmentHas4Rates() {
            var equipment = ctx.Equipment.Include(e => e.Rates).ToList();
            foreach(var e in equipment) {
                Assert.IsTrue(e.Rates.Count() == 4, "Expecting 4 Rates associated w. Equipment in TestData");
            }
        }

        [TestMethod] public void TestCustomers() {
            var customers = ctx.Customer.ToList(); //6 when run as a test suite
            Assert.IsTrue(customers.Count() == 2, "Expecting 2 Customers in TestData");
        }

        [TestMethod] public void TestRentals() {
            var rentals = ctx.Rental.ToList();
            Assert.IsTrue(rentals.Count() == 2, "Expecting 2 Rentals in TestData");
        }
    }
}

标签: c#.net

解决方案


这工作得很好。

namespace KKTest
{
    [TestClass] public class EquipDetailTests
    {
        [ClassInitialize] public static void Initialize(TestContext ctx) {
            var inMemory = new DbContextOptionsBuilder<ApplicationDbContext>()
                .UseInMemoryDatabase(databaseName: "TestDb")
                .Options;
            using var context = new ApplicationDbContext(inMemory);
            var data = new TestData(context);
            data.SeedDb();
        }

        static ApplicationDbContext context() {
            var inMemory = new DbContextOptionsBuilder<ApplicationDbContext>()
                .UseInMemoryDatabase(databaseName: "TestDb")
                .Options;
            return new ApplicationDbContext(inMemory);
        }

        [TestMethod] public async Task PageHasEquipmentTest() {
            var equipDetailCtlr = new EquipDetailController(context());
            int equipId = 1;
            var result = await equipDetailCtlr.EquipDetail(equipId);
            var viewResult = result as ViewResult;
            var equip = viewResult.Model as Equipment;
            Assert.AreEqual(equip.Id, equipId);
        }
}

推荐阅读