2017-09-13 97 views
1

我创建了一个简单的组合模式被定义为流利断言ShouldBeEquivalentTo总是具有不同的属性

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); 
     } 

此测试仍然通过,但不应该失败吗?

回答

0

Composite没有公开FA可以穿过的任何属性,因此它只会查看Count

+0

它不应该能够遍历复合,因为它实现了IEnumerable?或者我应该以不同的方式设置它? –

+0

你的例子不能编译,所以我不能自己尝试。顺便说一句,你正在使用哪个版本的FA? –

+0

已更新的组合类,以便它可能无法编译(构造函数中已删除的字符串参数)。希望能够现在编译,但目前无法测试,因为没有可用的PC。从记忆中,我使用了FA的最新稳定版本 –