Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递

Posted

技术标签:

【中文标题】Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递【英文标题】:Fluent Assertions ShouldBeEquivalentTo always passes with different properties 【发布时间】:2018-02-22 00:02:20 【问题描述】:

我创建了一个简单的复合模式,其组件定义为

public abstract class Component : IEnumerable<Component>
    
        protected EntityComponent(int id)
        
            Id = id;
        

        public int Id  get; protected set; 

        public abstract IEnumerator<EntityComponent> GetEnumerator();

        IEnumerator IEnumerable.GetEnumerator()
        
            return GetEnumerator();
        
    

及其复合实现为

public class Composite : Component
    
        private readonly IList<Component> childComponents = new List<Component>();

        public Composite(int id)
            : base(id)
        
        

        public int Count  get; set; 

        public void Add(Component child)
        
            childComponents.Add(child);
            Count++;
        

        public override IEnumerator<Component> GetEnumerator()
        
            foreach (var childComponent in childComponents)
        
            yield return childComponent;
            foreach (var component in childComponent)
            
                yield return component;
            
        
        
    

现在我正在使用 Fluent Assertions 设置一些测试来断言两个复合结构是否等价,例如,

[Fact]
        public void TestAssertions()
        
            var a1 = new Composite(1);
            var a2 = new Composite(2);

            a1.Add(a2);

            var b1 = new Composite(1);
            var b2 = new Composite(2);

            b1.Add(b2);

            a1.ShouldBeEquivalentTo(b1);
        

此测试按预期通过。但是,如果我更改其中一种复合材料的属性之一,即

[Fact]
        public void TestAssertions()
        
            var a1 = new Composite(1);
            var a2 = new Composite(2);

            a1.Add(a2);

            var b1 = new Composite(101);
            var b2 = new Composite(2);

            b1.Add(b2);

            a1.ShouldBeEquivalentTo(b1);
        

这个测试仍然通过,但它不应该失败吗?

【问题讨论】:

【参考方案1】:

Composite 不会暴露任何 FA 可以遍历的属性,因此它只会查看 Count

【讨论】:

实现了IEnumerable,是不是应该可以遍历composite?还是我应该以不同的方式进行设置? 您的示例无法编译,所以我无法自己尝试。顺便说一句,您使用的是哪个版本的 FA? 更新了复合类为什么它不能编译(在构造函数中删除了字符串参数)。希望现在可以编译,但由于目前我没有可用的 PC,因此无法测试。根据记忆,我使用的是最新的稳定版 FA

以上是关于Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fluent Assertions 库的多个断言

Fluent Assertions Should().BeEquivalentTo 只有私有字段

Fluent Assertions ShouldBeEquivalentTo 总是以不同的属性传递

Fluent Assertions:大致比较两个 2D 矩形阵列

ShouldBeEquivalentTo 的 C# Fluent Assertions 全局选项

Fluent Assertions:大致比较一个类的属性