【发布时间】:2017-06-15 10:47:36
【问题描述】:
最近我在FluentAssertions 中回答了SO question,描述了如何避免内部对象状态验证。现在我遇到了同样的问题,想知道为什么 FluentAssertions 验证内部属性 OOTB?
public class Class1
{
[Fact]
public void CompareCultureInternalFields()
{
var foo1 = new Foo();
var foo2 = new Foo();
foo1.ShouldBeEquivalentTo(foo2); // fails
}
public object Culture { get; set; }
}
public class Foo
{
public Foo()
{
InternalProp = Guid.NewGuid();
}
internal Guid InternalProp { get; }
}
异常详情:
Xunit.Sdk.XunitException: Expected member InternalProp to be {61625b04-c4e6-4e08-a45a-5ff8bb7d53e7}, but found {df589d73-e382-4104-8157-a41da2ca17f5}.
With configuration:
- Use declared types and members
- Compare enums by value
- Match member by name (or throw)
- Be strict about the order of items in byte arrays
对于处理公共 API 的消费者,foo1 和 foo2 对象是否应该等效?
【问题讨论】:
-
在您的示例中,如果该类位于另一个程序集/项目中,您应该无法访问内部属性。如果类在同一个程序集中,这不是一个很好的例子
-
好点。如果我用一些自动生成的内部字段重写示例怎么办?
-
好吧,我明白你的意思了。
-
我将
InternalProp设为只读。现在它只存储一些自动生成的值,这些值应该可以解决您对“跨项目”访问的担忧。现在看起来更正确了吗? -
这是 FluentAssertions 的作者做出的选择。除了作者,没有人能回答他们为什么做出这样的选择。我认为这是一个不错的选择吗?这是一个意见问题,这里不是讨论意见的地方。
标签: c# tdd fluent-assertions