Fluent Assertion:Dictionary Should BeEquivalentTo Excluding 属性 on Dictionary Value
Fluent Assertion: Dictionary Should BeEquivalentTo Excluding Property on Dictionary Value
我有一个名为 HandRank 的 class,它有一个 ID 属性。 Id 属性 是由我的数据库生成的。
public class HandRank
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int Rank { get; set; }
}
我有一个名为 GetHandRanks 的方法,其中 returns 一个 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
.
的成员
我有一个名为 HandRank 的 class,它有一个 ID 属性。 Id 属性 是由我的数据库生成的。
public class HandRank
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public int Rank { get; set; }
}
我有一个名为 GetHandRanks 的方法,其中 returns 一个 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
.