使所有 EF Core 模型属性虚拟化,以便使用 Moq 和 xUnit 在单元测试中进行模拟?

Make all EF Core model properties virtual for mocking in unit tests with Moq and xUnit?

我正在按照 EF Core 单元测试文档的建议使用 repository pattern。由于对 EF Core 而非 DB 上下文中的模型进行操作,我在代码中遇到了无法正确完全测试方法的情况。

下面是我的意思的一个例子:

待测代码:

    private static void AddToUserScore(Members member)
    {
        var basePoints = 2;

        if (member.HintAsked)
        {
            basePoints--;
            member.HintAsked = false;
        }

        if (member.LocationHintAsked)
        {
            basePoints--;
            member.LocationHintAsked = false;
        }

        member.UserScore += basePoints;
    }

EF 核心上下文模型本身:

public class Members
{
    public int MemberId { get; set; }
    public int AppId { get; set; }
    public string Username { get; set; }
    public int UserScore { get; set; }
    public string QuestionIds { get; set; }
    public int CurrentQuestionNumber { get; set; }
    public int LocationId { get; set; }
    public bool HintAsked { get; set; }
    public bool LocationHintAsked { get; set; }
}

单元测试样本:

 var fakeMemberMock = Fixture.Create<Mock<Members>>();
 fakeMemberMock.SetupSet(members => members.HintAsked = false);
 fakeMemberMock.VerifyGet(members => members.HintAsked, Times.Exactly(1));

由于我模型的 none 个属性是虚拟的,这将导致运行时出错。

我想知道是否有任何理由我应该让我的 EF Core 模型全部虚拟 这个目的。

我不确定这可能对与我的数据库交互产生任何副作用,也不确定这样做的利弊。我知道虚拟通常放在导航属性上,但我不知道在普通属性上这样做是否是个好主意。

请随意提及我正在尝试的另一种更简单的方法。

提前致谢。

请问,测试方法内部是不是太细化了?另一种方法是测试方法而不是模型 class。该方法执行一个可测试的工作单元。

// test case 1
var model1 = new Members();
model1.UserScore = 10;
model1.HintAsked = true;

// run the method AddToUserScore on model

// do the asserts
Assert.Equal(..., model1.UserScore);

// test case 2
var model1 = new Members();
model1.UserScore = 10;
model1.LocationHintAsked = true;