包含带有谓词的属性时的异常
Posted
技术标签:
【中文标题】包含带有谓词的属性时的异常【英文标题】:Exception when including properties with predicate 【发布时间】:2019-12-06 07:04:47 【问题描述】:我正在尝试比较具有多个属性的两个对象,但需要使用谓词比较特定属性(object1
在object2
处没有这些属性的确切值,因此我需要在此处比较部分字符串)。
所以,我正在尝试:
object1.Should().BeEquivalentTo(object2, options => options
.Including(o => o.Property1.StartsWith("something"))
.Including(o => o.Property2.StartsWith("something else")
);
我希望像往常一样比较所有其他属性。
但是,运行上面的代码会抛出异常:
消息:System.ArgumentException:表达式
<Convert(o.Property1.StartsWith("something"), Object)>
不能用于选择成员。 参数名称:表达式
我检查了文档,它与我的示例相同(https://fluentassertions.com/objectgraphs/ 上的“选择成员”一章)。
为什么会出现这个异常,我该如何解决?
【问题讨论】:
@Nkosi “更好的例子”是什么意思?我有两个具有一组字符串属性的相同类型的对象。我想断言这些对象是相等的,但是对于某些特定属性,断言应该基于谓词 (.StartsWith())。 断言object1.Property1.StartsWith("https://www.google.com")
等于object2.Property1 = "https://www.google.com/search?q=test"
。
【参考方案1】:
为什么会出现这个异常
异常发生是因为你调用了一个函数
.Including(o => o.Property1.StartsWith("something")) //<-- expects property only
在只期望获得属性表达式的表达式中。
.Including(o => o.Property1) //<-- expects property only
参考原始问题中链接的相同文档,您的示例在进行比较时将仅包含指定的成员。
根据您的尝试,您应该查看 Equivalency Comparison Behavior
部分,该部分基于您的 cmets,可能类似于以下示例
[TestClass]
public class ObjectEquivalencyTests
[TestMethod]
public void ShouldBeEquivalent()
var expected = new MyObject
Property1 = "https://www.google.com",
Property2 = "something else"
;
var actual = new MyObject
Property1 = "https://www.google.com/search?q=test",
Property2 = "something else"
;
actual.Should().BeEquivalentTo(expected, options => options
.Using<string>(ctx => ctx.Subject.Should().StartWith(ctx.Expectation))
.When(info => info.SelectedMemberPath == "Property1")
);
public class MyObject
public string Property1 get; set;
public string Property2 get; set;
【讨论】:
以上是关于包含带有谓词的属性时的异常的主要内容,如果未能解决你的问题,请参考以下文章