从单元测试 (MSTest) 代码尝试时,我的 DbSet<Entity> 不会更新

My DbSet<Entity> won't update when trying from Unit Testing (MSTest) code

我正在对我的 MVC 应用程序进行单元测试。其中一项测试是验证我的控制器是否正确返回所提供 ID 的数据。

为了对其进行单元测试,我想将数据从我的 [TestMethod] 添加到 Context.DBSet,然后调用我的 Controller 方法并验证其输出。

但是,我添加的记录并未反映在 Context.DBSet 对象中。

下面是我目前拥有的代码。

    ///for purpose of unit testing, there is no underlying database
    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
        {
            Database.SetInitializer(new ApplicationDbContextInitializer());
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
        public DbSet<Book> Books { get; set; }
        public DbSet<Customer> Customers { get; set; }
    }
    public class ApplicationDbContextInitializer : CreateDatabaseIfNotExists<ApplicationDbContext>
    {
        protected override void Seed(ApplicationDbContext context)
        {
            InitializeBooks(context);
            InitializeCustomers(context);
            base.Seed(context);
        }
    }
    //for brevity, i haven't posted the InitializeBooks & InitializeCustomers()
    //these methods create Book and Customer objects
    //and do context.Book.Add(objBook) and context.Customer.Add(objCustomer)

我的控制器 class 有我在 MS 测试中使用的 DbContext 对象

    public class CustomersController : Controller
    {
        public ApplicationDbContext db = new ApplicationDbContext();

        ///other methods exist too
    }

最后是我的 MSTest

[TestMethod]
public void TestCustomerIDReplacedCorrectly()
{
    var objCtrl = new CustomersController();
    Customer objCust = new Customer()
    {
        Name = "Foo Bar",
        Address = "Hello World",
    };

    Console.WriteLine(objCtrl.db.Customers.Count()) //returns 4 correctly
    objCtrl.db.Customers.Add(objCust);
    Console.WriteLine(objCtrl.db.Customers.Count()) //still returns 4!? it should return 5

    ///calls are given to controller method
    ///to fetch ViewResult and ViewBag
    ///to validate if it is processing the
    ///instance put inside the objCtrl.db.Customers
}

我看到添加的客户没有反映在客户的 DbContext 对象内部,因此即使我应该验证的实际控制器方法也没有反映我想要的行为。我如何确保我的 objCust 被添加到 objCtrl.db.Customers.Add

这是为播种调用的 InitializeCustomers() 代码

        private void InitializeCustomers(ApplicationDbContext context)
        {
            Customer cust1 = new Customer()
            {
                Name = "James Butt",
                Address = "6649 N Blue Gum St",
                Contact = "50-621 8927",
                NationalID = "12312312312"
            };

            Customer cust2 = new Customer()
            {
                Name = "Josephine Darakjy",
                Address = "Chanay, Jeffrey A Esq",
                Contact = "81-292 9840",
                NationalID = "123123124"
            };

            Customer cust3 = new Customer()
            {
                Name = "Art Venere",
                Address = "Chemel, James L Cpa",
                Contact = "85-636 8749",
                NationalID = "123123456"
            };


            Customer cust4 = new Customer()
            {
                Name = "Lenna Paprocki",
                Address = "Feltz Printing Service",
                Contact = "90-385 4412",
                NationalID = "32165498712"
            };

            context.Customers.Add(cust1);
            context.Customers.Add(cust2);
            context.Customers.Add(cust3);
            context.Customers.Add(cust4);

        }

您需要调用 objCtrl.db.SaveChanges(); 才能将对象添加到 DbSet。目前,您没有这样做,objCtrl.db.Customers.Count() 查询数据库以获取数据库中当前存储 的对象数。由于您尚未调用 SaveChanges,您的对象尚未写入数据库,因此不会包含在 .Count() 方法调用中。

通常使用单独的数据库,该数据库仅用于测试并植入所需数据(如果需要)进行测试。通常,您会看到每个测试都包含在一个事务中,以便您可以执行所需的测试、验证数据,然后回滚所有操作,以便数据库返回到每个测试的起始状态