从单元测试 (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()
方法调用中。
通常使用单独的数据库,该数据库仅用于测试并植入所需数据(如果需要)进行测试。通常,您会看到每个测试都包含在一个事务中,以便您可以执行所需的测试、验证数据,然后回滚所有操作,以便数据库返回到每个测试的起始状态
我正在对我的 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()
方法调用中。
通常使用单独的数据库,该数据库仅用于测试并植入所需数据(如果需要)进行测试。通常,您会看到每个测试都包含在一个事务中,以便您可以执行所需的测试、验证数据,然后回滚所有操作,以便数据库返回到每个测试的起始状态