2016-07-28 78 views
1

我有一個接口,我需要模擬相同的密鑰:AutoFixture - 接口與多個列表<T>的必須在所有列表

public interface IDataAccess 
{ 
    List<StaffItem> GetStaff(); 
    List<RankItem> GetRank(); 
    List<FleetItem> GetFleet(); 
    List<ContractItem> GetContract(); 
    List<BaseItem> GetBase(); 
} 

的問題是,每一個使用這些列表類的有共同財產。必須匹配,我真的很努力地創造這個模擬,而像Id這樣的共同點允許我測試這個接口注入到它們的類。

感謝您提前一切。

回答

1

AutoFixture允許在滿足特定條件時凍結標本。 [Frozen]屬性接收Matching參數,該參數確定當凍結樣本時的。在id下面的示例中,當要解決staffItem.Id屬性時,參數會被凍結。然後相同的值被注入rankItem.Id

[Theory, AutoData] 
    public void MatchByIdTest(
     [Frozen(Matching.PropertyName)]int id, 
     StaffItem staffItem, 
     RankItem rankItem) 
    { 
     Assert.Equal(staffItem.Id, rankItem.Id); 
     Assert.NotEqual(staffItem.SomeProp, rankItem.SomeProp); 
    } 

    public class StaffItem 
    { 
     public int Id { get; set; } 
     public int SomeProp { get; set; } 
    } 

    public class RankItem 
    { 
     public int Id { get; set; } 
     public int SomeProp { get; set; } 
    } 

相同的機制可以在更高級的情況下可以使用具有諷刺庫,例如NSubstitute。下面的示例使用AutoConfiguredNSubstituteCustomization其填充具有一些數據嘲笑但噴射相同ID到所有Id屬性:

[Theory, AutoConfigNSubstituteData] 
    public void MatchByIdTestWithAutoConfigNSubstitute(
     [Frozen(Matching.PropertyName)]int id, 
     IDataAccess da) 
    { 
     var staff = da.GetStaff().First(); 
     var rank = da.GetRank().First(); 

     Assert.Equal(staff.Id, rank.Id); 
     Assert.NotEqual(staff.SomeProp, rank.SomeProp); 
    } 

    internal class AutoConfigNSubstituteDataAttribute : AutoDataAttribute 
    { 
     public AutoConfigNSubstituteDataAttribute() 
      : base(new Fixture() 
        .Customize(new AutoNSubstituteCustomization()) 
        .Customize(new AutoConfiguredNSubstituteCustomization())) 
     { 
     } 
    }