C# 为什么FluentAssertions在验证内部构件时应等效?

C# 为什么FluentAssertions在验证内部构件时应等效?,c#,tdd,fluent-assertions,C#,Tdd,Fluent Assertions,最近,我回答了如何在中避免内部对象状态验证的问题。现在我面临着同样的问题,我想知道为什么FluentAssertions要验证OOTB的内部属性 public class Class1 { [Fact] public void CompareCultureInternalFields() { var foo1 = new Foo(); var foo2 = new Foo(); foo1.ShouldBeEquivalen

最近,我回答了如何在中避免内部对象状态验证的问题。现在我面临着同样的问题,我想知道为什么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
对象不应该是等价的吗?

我一直试图将其追溯到回购协议的起源,但显然一直都是这样。在某种程度上,
内部
属性在概念上是公共的。若您真的想将它们设计为不属于公共API的一部分,那个么将它们设置为私有。您可能遇到此问题的另一个原因是,您正在测试的范围可能有点小。为什么要将某些属性公开,而将其他属性内部化?同样,这只是我的一个假设,你可能有充分的理由这么做。但是,您始终可以排除该
内部属性。

在您的示例中,如果类位于另一个程序集/项目中,则您不应该能够访问内部属性。如果类处于相同的assemblyGood点,则这不是一个好的示例。如果我用一些自动生成的内部字段重写示例会怎么样?现在我明白你的意思了。我将
InternalProp
设置为只读。现在它只存储一些自动生成的值,这些值应该可以解决您对“跨项目”访问的担忧。现在看起来更正确了吗?这是FluentAssertions作者的选择。除了作者,没有人能回答他们为什么做出这样的选择。我觉得这是个好选择吗?这是意见的问题,这里不是讨论意见的地方。