2016-07-28 17 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())) 
     { 
     } 
    }