使所有 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;
我正在按照 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;