AutoFixture-与多个列表的接口<;T>';s在所有列表中必须具有相同的键

本文关键字:列表 gt 接口 lt AutoFixture- | 更新日期: 2023-09-27 17:59:08

我有一个需要模拟的接口:

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

问题是,用于这些列表的每个类都有一个公共属性。这必须匹配,我真的很难创建这个mock,同时有一个类似Id的公共类,允许我测试将这个接口注入其中的类。

提前感谢大家。

AutoFixture-与多个列表的接口<;T>';s在所有列表中必须具有相同的键

AutoFixture允许在满足特定条件时冻结样本。[Frozen]属性接收一个Matching参数,该参数确定何时冻结样本。在下面的示例中,当要解析staffItem.Id属性时,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,它用一些数据填充mock,但将相同的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()))
        {
        }
    }