gpt4 book ai didi

c# - 流利的断言 : Dictionary Should BeEquivalentTo Excluding Property on Dictionary Value

转载 作者:行者123 更新时间:2023-12-01 23:42:38 32 4
gpt4 key购买 nike

我有一个名为 HandRank 的类,它有一个 Id 属性。 Id 属性由我的数据库生成。

public class HandRank
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

public int Rank { get; set; }
}

我有一个名为 GetHandRanks 的方法,它返回一个 Dictionary<string, HandRank> .

在我的测试中,我在内存数据库中播种。由于 Id 属性由数据库确定,因此我希望将其从我的断言中排除。

下面是我的测试,但它失败了,因为 Id 属性没有在 expectedResult 中设置。我没有设置 Id,因为我不知道数据库生成的 Id 是什么。

[Test]
public void Test()
{
// arrange
var expectedResult = new Dictionary<string, HandRank>
{
{ "aaa", new HandRank { Rank = 1} },
{ "bbb", new HandRank { Rank = 2} }
};

// act
var actualResult = _handRankManager.GetHandRanks();

// Assert
actualResult.Should().BeEquivalentTo(expectedResult);
}

我希望断言需要类似于下面的内容,但我无法正确排除 Excluding 方法中的 lambda。

actualResult.Should().BeEquivalentTo(expectedResult, options => options.Excluding(x => x.Values.Id));

最佳答案

首先,如果您想过滤掉HandRank.Id,那么您可以使用以下方法:

actualResult.Should().BeEquivalentTo(expectedResult, opt =>
opt.Excluding(m =>
m.SelectedMemberInfo.DeclaringType == typeof(HandRank)
&& m.SelectedMemberInfo.Name.Equals(nameof(HandRank.Id))
));

如果忽略名为 "Id" 的属性是您希望在测试的许多部分中使用的东西,您最好将其取出到这样的函数中:

public static EquivalencyAssertionOptions<_> ExcludeId<_>(EquivalencyAssertionOptions<_> opt)
=> opt.Excluding(m => m.SelectedMemberInfo.Name.Equals("Id"));

并这样使用它:

actual.Should().BeEquivalentTo(expected, ExcludeId);

应该适用于字典、列表、具有深层属性的对象,以及您能想到的任何东西。它将完全忽略所有名为 Id 的成员。


编辑 2022:

根据下面的反馈,6.0 有一个 breaking changeSelectedMemberInfo 属性扁平化为 IMemberInfo,这使得排除项更易于阅读。

actual.Should().BeEquivalentTo(expected, opt =>
opt.Excluding(member =>
member.DeclaringType == typeof(X)
&& member.Name.Equals(nameof(X.Id))
));

关于c# - 流利的断言 : Dictionary Should BeEquivalentTo Excluding Property on Dictionary Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64777580/

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