AutoFixture - 具有多个List <t>的接口必须在所有列表中具有相同的密钥

时间:2016-07-28 13:41:14

标签: c# unit-testing autofixture

我有一个我需要模拟的界面:

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

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

提前感谢你们。

1 个答案:

答案 0 :(得分: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()))
        {
        }
    }