2017-09-13 98 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的最新穩定版本 –