如何在 .net 核心中使用 xunit 对嵌套方法进行单元测试
How to unit test nested method using xunit in .net core
我有以下情况
public long Update(ExpenseViewModel updateModel, string einterpriseid)
{
long internId;
ExpenseReq expenseRequest = GetReqById(updateModel.Id);
if (expenseRequest != null)
{
int DraftStatusID = GetStatusID("Draft");
int PendingStatusID = GetStatusID("Pending Approval");
}
}
public ExpenseReq GetReqById(int id)
{
return _db.ExpRequest
.Include(x => x.Profile).AsNoTracking()
.Include(x => x.ExpReqStatus).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpenseReqTravelDetails).AsNoTracking()
.Include(x => x.AddDetail)
.ThenInclude(x => x.ExpRejReason).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpenseTypes).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpReqApprover).AsNoTracking()
.Include(x => x.Comp).AsNoTracking()
.Where(x => x.Id == id).FirstOrDefault();
}
当我在 Update
上执行单元测试时,GetReqById
函数总是返回我 null
因为 if 条件没有得到满足并且在 if 条件行覆盖范围内没有发生。我想在 if 条件下获取代码覆盖率。如何为它编写单元测试?
我在下面尝试过:
[Fact]
public void Should_Update()
{
var options = new DbContextOptionsBuilder<dbContextobj>().UseInMemoryDatabase(databaseName: "fakedb").Options;
using (var context = new dbContextobj(options))
{
var controller = new ExpenseRequestService(context);
var result = controller.Update(expenseRequestUpdateViewModel, "test");
Assert.Equal(0, result);
}
}
这很好用,但 GetReqById
没有被覆盖。请帮我提供一些示例代码。
谢谢。
您可以使用所需数据设置数据库:
[Fact]
public void Should_Update()
{
// Assign
var options = new DbContextOptionsBuilder<dbContextobj>().UseInMemoryDatabase(databaseName: "fakedb").Options;
using var context = new dbContextobj(options);
context.ExpenseReq.Add(new ExpenseReq { Id = "test" })
context.SaveChanges();
var controller = new ExpenseRequestService(context);
// Act
var result = controller.Update(expenseRequestUpdateViewModel, "test");
// Assert
Assert.Equal(0, result);
}
然而,由于使用了 InMemoryDatabase
.
,许多人会评论说这在技术上不是 unit 测试
我有以下情况
public long Update(ExpenseViewModel updateModel, string einterpriseid)
{
long internId;
ExpenseReq expenseRequest = GetReqById(updateModel.Id);
if (expenseRequest != null)
{
int DraftStatusID = GetStatusID("Draft");
int PendingStatusID = GetStatusID("Pending Approval");
}
}
public ExpenseReq GetReqById(int id)
{
return _db.ExpRequest
.Include(x => x.Profile).AsNoTracking()
.Include(x => x.ExpReqStatus).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpenseReqTravelDetails).AsNoTracking()
.Include(x => x.AddDetail)
.ThenInclude(x => x.ExpRejReason).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpenseTypes).AsNoTracking()
.Include(x => x.AdditionalDetails)
.ThenInclude(x => x.ExpReqApprover).AsNoTracking()
.Include(x => x.Comp).AsNoTracking()
.Where(x => x.Id == id).FirstOrDefault();
}
当我在 Update
上执行单元测试时,GetReqById
函数总是返回我 null
因为 if 条件没有得到满足并且在 if 条件行覆盖范围内没有发生。我想在 if 条件下获取代码覆盖率。如何为它编写单元测试?
我在下面尝试过:
[Fact]
public void Should_Update()
{
var options = new DbContextOptionsBuilder<dbContextobj>().UseInMemoryDatabase(databaseName: "fakedb").Options;
using (var context = new dbContextobj(options))
{
var controller = new ExpenseRequestService(context);
var result = controller.Update(expenseRequestUpdateViewModel, "test");
Assert.Equal(0, result);
}
}
这很好用,但 GetReqById
没有被覆盖。请帮我提供一些示例代码。
谢谢。
您可以使用所需数据设置数据库:
[Fact]
public void Should_Update()
{
// Assign
var options = new DbContextOptionsBuilder<dbContextobj>().UseInMemoryDatabase(databaseName: "fakedb").Options;
using var context = new dbContextobj(options);
context.ExpenseReq.Add(new ExpenseReq { Id = "test" })
context.SaveChanges();
var controller = new ExpenseRequestService(context);
// Act
var result = controller.Update(expenseRequestUpdateViewModel, "test");
// Assert
Assert.Equal(0, result);
}
然而,由于使用了 InMemoryDatabase
.