为啥 FluentAssertions ShouldBeEquivalentTo 验证内部?

Posted

技术标签:

【中文标题】为啥 FluentAssertions ShouldBeEquivalentTo 验证内部?【英文标题】:Why does FluentAssertions ShouldBeEquivalentTo validate internals?为什么 FluentAssertions ShouldBeEquivalentTo 验证内部? 【发布时间】: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 的消费者,foo1foo2 对象是否应该等效

【问题讨论】:

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

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

【讨论】:

以上是关于为啥 FluentAssertions ShouldBeEquivalentTo 验证内部?的主要内容,如果未能解决你的问题,请参考以下文章

合并来自 git revert 的冲突 - 我应该接受当前的更改还是传入,为啥?

提供 FluentAssertions 的扩展

FluentAssertions 是不是支持字典的 WithStrictOrdering?

FluentAssertions 不应该包含失败

Fluentassertions.ShouldBeEquivalentTo 中的 Ignoredatamember

FluentAssertions:int.Should().Equals 返回错误的结果?