gpt4 book ai didi

c# - 单元测试中的模拟在 LINQ.Where 处返回 null

转载 作者:行者123 更新时间:2023-11-30 23:03:56 25 4
gpt4 key购买 nike

我有两个类 BeamTreatment,我想用它们的值 DateTime TimeStamp 进行匹配。所以在我的代码中,我有一个 LINQ .Where() 来搜索一个特殊的 TimeStamp 并将其与预先排序的列表进行比较。对于真实数据,它工作得非常好,没有任何错误,但现在我被告知要为此类编写单元测试,而使用 Moq 我没有得到预期的结果。

我的代码中行不通的是:

Treatment searchedBeam = (Treatment)InputData.Treatments.
Where(beam => beam.TimeStamp == sortingList[j + i * rangeOfBeams]).FirstOrDefault();

i,j 是 for 循环的索引,并且如我在 Debug模式下看到的那样正确运行。

在我的单元测试代码中我有这个:

Mock<ITreatmentGroup> treatGroupMock1;
[SetUp]
public override void Init()
{
base.Init();

// --- Create Plan Mock
// some code here

// --- Create Treatment Mock
DateTime time1 = new DateTime(2000, 01, 01, 12, 00, 00);
DateTime time2 = new DateTime(2000, 01, 01, 13, 00, 00);

Mock<ITreatment> treatMock1 = new Mock<ITreatment>();
treatMock1.Setup(t => t.TimeStamp).Returns(time1);
Mock<ITreatment> treatMock2 = new Mock<ITreatment>();
treatMock2.Setup(t => t.TimeStamp).Returns(time2);

treatGroupMock1 = new Mock<ITreatmentGroup>();
treatGroupMock1.Setup(tg => tg.Treatments).Returns(new List<ITreatment>() { treatMock1.Object, treatMock2.Object });
}

在调试过程中,我检查了模拟数据与真实数据的结构是否相同。但是接下来是我的测试代码:

[Test]
public void Matched_MatchedAndSortedPlan_FunctionCheck()
{
IPlan result = Matched.MatchedAndSortedPlan(_planMock.Object, _treatGroupMock1.Object, out IList<string> errors);

Assert.IsEmpty(errors);
Assert.IsNotNull(result);
Assert.IsTrue(result.FractionGroups[0].Beams.Any(f => f.BeamName == "beamMock1"));
}

所以我使用模拟数据调用我的方法,就像使用真实数据一样,它应该可以工作,但是正如我提到的,带有 LINQ 表达式的行返回 null 所以 Assert 命令让单元测试失败。

我得到的最大提示是模拟 LINQ 表达式存在一些问题,但我不想模拟 LINQ 表达式,而是将其用于我的解决方案。这里的其他问题如 thisthis Google 将我显示为我搜索的第一个点击,我认为在这里不起作用。

我希望你能为我提供其他线索或提示。

最佳答案

Linq Where 工作正常。 searchedBeam 被分配为 null 因为试图从模拟接口(interface)转换为具体类型。

                          right here
|
v
Treatment searchedBeam = (Treatment)InputData.Treatments.
Where(beam => beam.TimeStamp == sortingList[j + i * rangeOfBeams]).FirstOrDefault();

您正在将返回的结果转换为 Treatment,而测试集合中设置的项目只是 ITreatment 的模拟。

如果您能够创建没有副作用的 Treatment 的实际实例,那么创建并使用它们进行测试

[SetUp]
public override void Init() {
base.Init();

// --- Create Plan Mock
// some code here

// --- Create Treatment Mock
DateTime time1 = new DateTime(2000, 01, 01, 12, 00, 00);
DateTime time2 = new DateTime(2000, 01, 01, 13, 00, 00);

var treatMock1 = new Treatment {
TimeStamp = time1
};
var treatMock2 = new Treatment {
TimeStamp = time2
};

treatGroupMock1 = new Mock<ITreatmentGroup>();
treatGroupMock1.Setup(_ => _.Treatments).Returns(new List<ITreatment>() { treatMock1, treatMock2 });
}

这样,在进行测试时类型转换的行为就会符合预期。

关于c# - 单元测试中的模拟在 LINQ.Where 处返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com