我有一个项目,其中我必须使用带有实体框架的数据库(sqlexpress数据库),并且必须对其进行单元测试,在我的计算机和我的团队计算机上,这些测试有效,但是在github(工作流程测试等)上这些测试不起作用。这是因为据我所知,在github上,测试是在ubuntu机器上运行的。由于此sqlexpress无法正常工作,所以我的问题是我如何更改代码,以便对其进行测试,但使用内存数据库中的sql lite,以便测试可以在线进行
这是我的考验
public class CompaniesControllerTest
{
//fake test entities
private AddressDetail[] fakeAddressDetails = new[] {
new AddressDetail {
Id = Guid.Parse("7DBBA9EF-97E6-4D06-A6CC-E2426C170780"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("A4E33A9F-D767-42F0-895A-E68472724BAB"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("63E7436F-9A0E-447E-85BD-1B17876B44D1"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("244C084F-BC5A-4865-8713-A5C2C1F15586"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("63D85903-9062-4595-9468-FBA62171B4B6"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("9F36B357-8C90-4643-AC0D-93DC98D23185"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
},
new AddressDetail
{
Id = Guid.Parse("62C53856-FBBF-4731-BDDF-C66F77A3321D"),
AddressLine = "Steenweg op Etterb. 180",
Postal = "1040",
City = "Brussel",
IsDeleted = false,
CreationDate = DateTime.Now
}
};
private Company[] fakeCompanies = new[]
{
new Company { Id = Guid.Parse("C5E36951-7223-454D-9FA8-4E63E26AB264") , Name = "Google", VAT = "054987846198", AddressDetails = new AddressDetail {Id = Guid.Parse("2B2EA755-79AD-462A-B132-26B056480F75"), AddressLine = "Steenweg op Etterb. 180", Postal = "1040", City = "Brussel", IsDeleted = false, CreationDate = DateTime.Now}, IsDeleted = false , CreationDate = DateTime.Now },
new Company { Id = Guid.Parse("5EAD5F07-2578-4AFC-A52C-C67E8FBC8112"), Name = "Amazon", VAT = "054987846199", AddressDetails = new AddressDetail {Id = Guid.Parse("B4BA1471-4D77-405F-A2CB-5CB0229379B1"), AddressLine = "Steenweg op Etterb. 180", Postal = "1040", City = "Brussel", IsDeleted = false, CreationDate = DateTime.Now}, IsDeleted = false, CreationDate = DateTime.Now }
};
private Project[] fakeProjects = new Project[]
{
new Project
{Id = Guid.Parse("6E8CB590-4CAC-49D2-A532-36222DEA7C83"),
Name = "project 2",
Description = "project 1",
IsDeleted = false,
CreationDate = DateTime.Now
},
new Project
{
Id = Guid.Parse("9E739A70-3E68-436B-AF47-60129F6DC960"),
Name = "project 3",
Description = "project 1",
IsDeleted = false,
CreationDate = DateTime.Now
},
new Project
{
Id = Guid.Parse("B1C6778D-D09B-495C-9F8B-7D0AD87DE6AF"),
Name = "project 4",
Description = "project 1",
IsDeleted = false,
CreationDate = DateTime.Now
},
new Project
{
Id = Guid.Parse("2CF622F0-4020-45B0-B290-F11C9B3E7803"),
Name = "project 5",
Description = "project 1",
IsDeleted = false,
CreationDate = DateTime.Now
},
new Project
{
Id = Guid.Parse("2438197A-B657-4E45-9D5F-0FD8B342F50A"),
Name = "project 6",
Description = "project 1",
IsDeleted = false,
CreationDate = DateTime.Now
}
};
[Fact]
public void Index_ReturnsCorrectCompanies()
{
/*
* ARRANGE
*/
var fakeContext = CreateContextMock();
var controller = new CompaniesController(fakeContext.Object);
var result = controller.Index();
var viewResult = Assert.IsType<ViewResult>(result);
var model = Assert.IsAssignableFrom<CompanyIndexViewModel>(viewResult.ViewData.Model);
Assert.Equal(fakeCompanies.Length, model.Companies.Count());
Assert.Subset(fakeCompanies.ToHashSet(), model.Companies.ToHashSet());
}
private Mock<GradeContext> CreateContextMock()
{
// mock dbsets
var mockCompaniesSet = CreateDbSetMock(fakeCompanies);
var mockAddressDetailsSet = CreateDbSetMock(fakeAddressDetails);
var mockProjectsSet = CreateDbSetMock(fakeProjects);
// mock context
var mockContext = new Mock<GradeContext>();
mockContext.Setup(mock => mock.Companies)
.Returns(mockCompaniesSet.Object);
mockContext.Setup(mock => mock.AddressDetails)
.Returns(mockAddressDetailsSet.Object);
mockContext.Setup(mock => mock.Projects)
.Returns(mockProjectsSet.Object);
return mockContext;
}
private Mock<DbSet<T>> CreateDbSetMock<T>(IEnumerable<T> elements) where T : class
{
var elementsAsQueryable = elements.AsQueryable();
var dbSetMock = new Mock<DbSet<T>>();
dbSetMock.As<IQueryable<T>>().Setup(m => m.Provider).Returns(elementsAsQueryable.Provider);
dbSetMock.As<IQueryable<T>>().Setup(m => m.Expression).Returns(elementsAsQueryable.Expression);
dbSetMock.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(elementsAsQueryable.ElementType);
dbSetMock.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(elementsAsQueryable.GetEnumerator());
return dbSetMock;
}
}
这是我要测试的公司控制器的索引方法
private GradeContext gradeContext;
public CompaniesController(GradeContext context)
{
gradeContext = context;
}
public IActionResult Index()
{
var model = new CompanyIndexViewModel();
model.Companies = gradeContext.Companies
.Where(x => x.IsDeleted == false)
.ToList();
model.AddressDetails = gradeContext.AddressDetails
.Where(x => x.IsDeleted == false)
.ToList();
model.Projects = gradeContext.Projects
.Where(x => x.IsDeleted == false)
.ToList();
return View(model);
}
我有一种无需使用模拟即可测试的方法