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允许在满足特定条件时冻结样本。[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()))
{
}
}