如何在 .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 测试