c# - 如何在 .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");
}
}
}
解决方案
这工作得很好。
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);
}
}
推荐阅读
- cplex - 带有后缀元组的 CPLEX 中的求和
- python - 将数字作为字符串从文本导入数据框
- c++ - 如何在我的 C++ 项目中包含一个 activeX 库?
- python - 如何从python中的包导入非包
- c# - LINQ 将列表项列表加入一个列表
- r - 使用 ggplot2 在 R 中标记计数器位置
- jquery - Jquery向按钮添加额外的字符
- excel - 需要使用 Apache POI 在 ADF 中下载 Excelsheet
- python - 对于给定的稀疏矩阵,如何将其与给定的二进制值向量相乘
- android - java.lang.NoClassDefFoundError:解析失败:Lcom/Google/Android/gms/common/API/API$zzf;