我有一个我需要模拟的界面:
public interface IDataAccess
{
List<StaffItem> GetStaff();
List<RankItem> GetRank();
List<FleetItem> GetFleet();
List<ContractItem> GetContract();
List<BaseItem> GetBase();
}
问题是用于这些列表的每个类都有一个共同的属性。必须匹配,我真的很难创建这个模拟,同时有一个像Id
的共同点,以允许我测试将这个接口注入其中的类。
提前感谢你们。
答案 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()))
{
}
}